2010-06-30 120 views
1

我是moq和單元測試的新手。所以,我不完全理解它。如果問題是愚蠢的,請原諒我。請幫助我瞭解以下情況。單元測試拋出「System.NullReferenceException」,使用Moq和Nunit

以下是我簡單的測試

[Test] 
public void TryMoq() { 
    var mock = new Mock<IDummyInterface>(); 
    var dummy = new DummyClass(mock.Object); 
    mock.VerifySet(m => m.Model = It.Is<DummyModel>(mo => mo.MyProperty == "foo")); 
} 

和我米試圖測試

public class DummyClass 
{ 
    public DummyClass(IDummyInterface i) { 
     i.Model = new DummyModel() ; 
     i.Model.MyProperty = "foo"; 

    } 
} 

public class DummyModel 
{ 
    public string MyProperty { get; set; } 
} 

public interface IDummyInterface { 
    DummyModel Model { get; set; } 
} 

現在行 「i.Model.MyProperty = 」富代碼「;」 「System.NullReferenceException」正在被拋出。

爲什麼我認爲自從我使用Moq以來的原因。

奇怪的是,如果我改變了「DummyClass」的構造函數。像這樣

public DummyClass(IDummyInterface i) 
    { 
     i.Model = new DummyModel() { MyProperty ="foo"}; 
     //i.Model.MyProperty = "foo"; 

    } 

測試通行證。在第二種情況下,即使我嘗試將「foo」的值更改爲「bar」。測試失敗(雖然這很好)。

我只是想了解發生了什麼事情。以及我想如何檢查和驗證孩子的財產。

回答

1

兩種情況之間的區別是,當你寫

i.Model = new DummyModel() { MyProperty ="foo"}; 

你基本上是寫

var dummyModel = new DummyModel() { MyProperty ="foo"}; 
i.Model = dummyModel; 

也就是說,你傳遞給你的界面該屬性已被設置爲「Foo」的對象。您的測試聲明「有人會嘗試將Mock上的屬性設置爲DummyModel類型的對象,其中屬性MyProperty設置爲」Foo「」,這正是發生的情況。

第一種情況失敗,因爲執行以下行後,i.Model爲空。

i.Model = new DummyModel(); 

獲取或直接設置在一個模擬的屬性將不設置該屬性,它只會什麼也不做,或者返回一個空,除非你指定你想要它做的事情。所以在這種情況下,會發生什麼情況是,在構造函數的第二行中,i.Model爲null,這會導致i.Model.MyProperty上的null異常。

+0

感謝您的好解釋。隨你的答案。我也很喜歡「arneeiri」的回覆,因爲它解決了我的問題:) – Mohit 2010-06-30 21:43:34

2

的模擬不記得財產的價值,除非你告訴它:

i.Model = new DummyModel(); 

將導致模擬要記住,你將其設置爲對象。但是,如果您訪問該屬性,它仍然會返回null。如果你希望它表現得像一個自動特性,使用方法:

mock.SetupAllProperties(); 

現在

i.Model.MyProperty = "foo"; 

不會失敗了。通過模擬,您總是需要明確指定所有行爲。

瞭解更多關於:http://code.google.com/p/moq/wiki/QuickStart

+0

感謝「arneeiri」解決問題。但是,我正在尋找解釋。但是,SetupAllProperties爲我解決了這個問題,非常感謝。 – Mohit 2010-06-30 21:45:11

1

你也可以這樣做:

var mock = new Mock<IDummyInterface>(); 
mock.SetupSet(m => m.Model = It.Is<DummyModel>(mo => mo.MyProperty == "foo")).Verifiable(); 

var dummy = new DummyClass(mock.Object); 

mock.Verify(); 

起訂量的m.Model的默認實現是返回NULL,所以你將需要給假人()的東西比一個默認的模擬多。