2012-10-18 133 views
3

使用Rhino Mocks 3.6,給定下面的代碼我希望AssertWasCalled斷言通過,但它不。取而代之的是失敗的斷言消息:犀牛嘲笑'AssertWasCalled測試方法模擬的屬性分配

「Rhino.Mocks.Exceptions.ExpectationViolationException: IBar.set_Model(7);預期#1,實際0#」。

嘗試IgnoreArguments()不會更改結果,但將IBar屬性更改爲方法並斷言該方法是使用參數調用的。

我在這裏錯過了什麼?

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Rhino.Mocks; 

public interface IFoo { } 
public interface IBar { int Model { get; set; } } 
public class Bar : IBar { public int Model { get; set; } } 

public class Foo : IFoo 
{ 
    public void MyMethod(IBar bar) 
    { 
     bar.Model = 7; 
    } 
} 

[TestClass] 
public class TestFoo 
{ 
    [TestMethod] 
    public void MyMethod() 
    { 
     var foo = new Foo(); 

     var mockBar = MockRepository.GenerateStub<IBar>(); 
     foo.MyMethod(mockBar); 

     mockBar.AssertWasCalled(b => b.Model = 7); 
    } 
} 

回答

6

如果您磕碰你的酒吧對象,那麼你應該做主張對財產

Assert.AreEqual(7, mockBar.Name); 

值。如果你想測試的期望,你應該生成模擬,而不是存根

var mockBar = MockRepository.GenerateMock<IBar>(); 
foo.MyMethod(mockBar); 
mockBar.AssertWasCalled(b => b.Model = 7); 

Difference between stubs and mocks

模擬是我們可以設置預期的一個對象,哪一個將會確認預期的行爲確實發生。存根是一個 對象,您將其用於傳遞給待測代碼。你可以在 上設置它的期望,所以它會以某種方式行事,但是那些 的期望永遠不會被驗證。存根的屬性 將自動錶現得像普通屬性,並且不能對其設置 期望值。

如果你想驗證被測代碼的行爲,你將使用一個具有適當期望的模擬,並驗證。如果你想只傳遞一個值,可能需要以某種方式行事,但 不是這個測試的焦點,你將使用一個存根。

+0

我把這個標記爲答案,因爲切換到模擬確實解決了我的問題,而且我相信這是它失敗的原因。但是,我認爲重要的是要注意我沒有設定預期,而是斷言發生了事情。如果規則是你必須有嘲笑做到這一點,那將是一回事,但使用存根這對工作很好的方法,所以有一些不一致。 –