2015-04-27 39 views
1

重構項目中的單元測試時,我發現一些本應該失敗但由於某種神祕原因而成功的測試。去除不相關的代碼和一切移動到一個方法後,以下最小例仍然具有原始的行爲:AssertWasCalled傳遞未使用的變量

[Test] 
public void TestThatShouldFail() 
{ 
    // Arrange 
    var mock = MockRepository.GenerateStub<ISomething>(); 
    mock.Stub(wi => wi.SomeProperty).Return(MockRepository.GenerateStub<ISomeProperty>()); 
    mock.SomeProperty.Stub(t => t.SomethingElse).Return(new SomethingElse()); 
    ... 

    // Act  
    _foo.Foo(); 

    // Assert 
    mock.AssertWasCalled(wi => wi.SomeProperty.DoSomething()); 
} 

可變mock不會傳遞,暴露或以任何方式這是提供給在運行的代碼導出部分。儘管如此,測試通過了,這應該表示方法在mock變量的SomeProperty上被調用,這顯然是錯誤的。

這是怎麼發生的?

回答

2

上面的代碼已經是一些調查的結果,所以它只包含與問題及其解決方案相關的行。

罪魁禍首是排列部分的最後一行。

事實證明,在斷言線並沒有真正檢查DoSomething方法是否叫上SomeProperty,但無論SomeProperty已於mock訪問!而我們實際上是在最後中排列的行,當在它上面寫上一個方法時。

我找不到任何官方文檔,所以我只能假設它只考慮表達式的第一級,所以不應該將表達式與多級成員訪問(點)至AssertWasCalled(或AssertWasNotCalled)。

(檢查它是​​正確的方法,但在這裏並不需要它。)