2013-10-23 86 views
1

使用參數化構造函數嘲諷對象時,如果在構造函數中初始化的屬性是虛擬的,則Moq不會設置屬性值。但是,如果它是非虛擬財產,Moq設置價值。使用虛參數和參數構造函數的Moq行爲

以下是我的課我想嘲笑。

public class Activity 
{ 
    private Activity() {} 
    public Activity(string code, string description, string option) 
    { 
     if(string.IsNullOrEmpty(code)) throw new ArgumentNullException("code"); 
     if (string.IsNullOrEmpty(option)) throw new ArgumentNullException("option"); 

     Code = code; 
     Description = description; 
     Option = option; 
    } 

    public virtual string Code { get; private set; } 
    public virtual string Description { get; private set; } 
    public virtual string Option { get; private set; } 

} 

這是我嘗試嘲笑它:

[TestMethod] 
    public void It_Creates_Mock_For_A_Class() 
    { 
     var mock = new Mock<Activity>("Code 1", null, "Option"); 
     Assert.IsNotNull(mock.Object); 
     Assert.AreEqual("Code 1", mock.Object.Code); 
    } 

測試方法失敗說: Assert.AreEqual失敗。預期:。實際:<(null)>。

但是,如果我從所有屬性中刪除virtual關鍵字,它將起作用並通過測試用例。

由於實體框架的原因,我必須保持屬性的虛擬性。

任何線索?如何解決這個問題?

+0

其實測試的測試MOQ框架,而不是測試你的構造函數的實現。你想測試什麼?你只問過最奇怪的MOQ行爲嗎? –

+0

@IlyaPalkin上面只是一個例子,用於演示我在Moq遇到的虛擬/非虛擬屬性時遇到的問題。由於這個問題,我試圖編寫的很多行爲測試用例都失敗了,因爲Activity類的私有方法在內部使用這些屬性並找到它們爲空。 – 101V

回答

1

發現如果「CallBase」屬性設置爲true,它解決了問題。

通過查看對象瀏覽器的組裝,總結說:

摘要: 無論如果沒有安裝匹配的底座部件虛擬實現將呼籲嘲笑類。默認爲false。

,工程代碼:

[TestMethod] 
    public void It_Creates_Mock_For_A_Class() 
    { 
     var mock = new Mock<Activity>("Code 1", null, "Option"); 
     mock.CallBase = true; 
     Assert.IsNotNull(mock.Object); 
     Assert.AreEqual("Code 1", mock.Object.Code); 
    } 
+0

我沒有使用'mock.CallBase = true;'之前,但它是我將來肯定會使用的東西。無論如何,我認爲還有其他更好的解決方案。 –

+0

@IlyaPalkin你可以請分享更好的解決方案。 – 101V

+1

**如果您測試依賴於「活動」**的課程,那麼您將創建「模擬」並設置其公共屬性或方法。在這種情況下,被測單元就是該類的一個實例。 **如果你測試'Activity'**,那麼你應該測試一個'Activity'類型的實例。所有私有方法通常通過公共方法進行測試。 –