2012-10-05 40 views
1

好吧,讓我們假設我有一個像下面...錯誤設置物業在單元測試使用起訂量

public class Foo : IFoo 
{ 
    public string Bar 
    { 
     get { ... } 
    } 

    public void Initialize() 
    { 
     ... 
    } 
} 

類......,正如你可以看到它實現了一個接口,所以我可以嘲笑它。現在,在我的單元測試我建立這樣的模擬...

var mock = new Mock<IFoo>(); 
mock.SetupProperty(p => p.Bar).SetReturnsDefault("Some static value here."); 

...然而,當測試運行,我得到以下錯誤...

System.ArgumentException :屬性IFoo.Bar是隻讀的。 參數名:表達

所以,三個問題:

  1. 我在做什麼錯?
  2. 我需要做什麼?
  3. 你能解釋我怎麼誤解了SetReturnsDefault

謝謝大家!

回答

9

顯然,錯誤消息告訴你,你不能嘲笑這樣的只讀屬性。相反,嘗試:

mock.SetupGet(p => p.Bar).Returns("whatever"); 

如果你想未明確設置,返回一些字符串的所有字符串屬性然後做這樣的:

mock.SetReturnsDefault<string>("whatever"); 
// IMPORTANT: don't call mock.SetupGet(p => p.Bar) as it will override default setting 
-3

試試這個: -

public class Foo : IFoo 
{ 
    priave string bar; 
    public string Bar 
    { 
     get { ... } 
     set {bar=value;} 
    } 

    public void Initialize() 
    { 
     ... 
    } 
} 

您必須指定Set。否則它將只能讀取。

+1

這並不能解決問題,因爲'Bar'在原來的接口仍然是隻讀的 –

+0

還改變生產代碼,以便測試表現良好,並不是在所有可能的情況是個好主意 – cmart