2012-10-10 60 views
0

一類這樣的起訂量 - 虛擬財產對象不能寫外面

public abstract class TT 
{ 
    public virtual int ID { get; set; } 
} 
public class X 
{ 
    public void F(TT t) 
    { 
     t.ID = 100; 
    } 
} 

功能X.F使用TT做一些事情。 我什麼測試F。

所以

[TestMethod] 
public void T() 
{ 
    var t = new Mock<TT>(); 
    new X().F(t.Object); 
    Assert.AreEqual(100, t.Object.ID); 
} 

但t.Object.ID始終爲 「0」。 當我將ID設置爲不虛擬時,它已通過。

那麼,爲什麼呢?我怎樣才能讓虛擬財產可以被記錄?

回答

2

問題在於Moq是如何構建模擬的。因爲在這種情況下,它是通過擴展你的類和覆蓋來實現的,標記爲虛擬的屬性是由Moq處理的屬性。

所以我相信是失蹤在您的實現是屬性的設置:

t.SetupProperty(f => f.ID); 

而且使用也可以有訂貨數量設置了所有的屬性:

t.SetupAllProperties(); 

很多有用的例子可以在這裏找到:http://code.google.com/p/moq/wiki/QuickStart

+0

完成了!謝謝〜:D – peter

2

因爲TT是一個虛擬方法(而不是一個接口)的類,這些是另一種選擇。

正如Pablo的回答中所提到的,Moq擴展了你的班級,覆蓋了虛擬財產。但是,有一個選項CallBase,它告訴Moq在沒有定義設置的情況下使用原始(重寫)版本。

如果在模擬上將CallBase設置爲true,則將調用原始屬性,並且不需要顯式設置屬性。

[TestMethod] 
public void T() { 
    var t = new Mock<TT>() { CallBase = true }; 
    new X().F(t.Object); 
    Assert.AreEqual(100, t.Object.ID); 
} 

這不是比使用SetupUpAllProperties()一個更好的答案,但在一個要使用設置爲只有部分的功能的情況下非常有用的。

+0

確實是另一個很好的選擇!我們應該在這個上得到共享信用:) –