2012-08-24 43 views
6

我想跟蹤Rhino Mocks調用方法。假設我有這樣的代碼:Rhino Mocks,VerifyAllExpectations

public class A 
{ 
    protected IB _b; 

    public A(IB b) 
    { 
     _b = b; 
    } 

    public void Run(string name) 
    {    
     _b.SomeCall(new C { Name = name }); 
    } 
}  

public interface IB 
{ 
    void SomeCall(C c); 
}  

public class C 
{ 
    public string Name { get; set; } 
    // more attributes here 
} 

而且測試的樣子:

// prepare 
var bMock = Rhino.Mocks.MockRepository.GenerateStrictMock<IB>(); 
bMock.Expect(x => x.SomeCall(new C { Name = "myname" })); 
var sut = new A(bMock); 

// execute 
sut.Run("myname"); 

// assert 
bMock.VerifyAllExpectations(); 

測試失敗了ExpectedViolationException因爲犀牛嘲笑框架檢測2不同的C-類。

如果被測主體在被測方法中創建了對象參數,我該如何檢查該調用?有沒有機會告訴Rhino Mocks檢查參數爲「Equals」?

謝謝!

回答

12

我建議你使用更容易(和更好的可維護性)AAA語法。在大多數情況下,嚴格的嘲笑比其他任何事情都更加痛苦。

參數使用Equals進行比較。如果C不覆蓋Equals,則通過引用進行比較,並且與您的情況不匹配。使用以其他方式檢查參數。

// arrange 
var bMock = MockRepository.GenerateMock<IB>(); 
var sut = new A(bMock); 

// act 
sut.Run("myname"); 

// assert 
bMock.AssertWasCalled(x => x.SomeCall(Arg<C>.Matches(y => y.Name == "myname")); 
+0

嗨,編譯器說:「不能將lambda表達式轉換爲類型'Rhino.Mocks.Constraints.AbstractConstraint',因爲它不是委託類型。」指向「x => x.Name =」myname「」 – Jordi

+0

將賦值equals(=)固定爲比較(==)。 –

+0

仍然是同樣的問題。我錯過了什麼? http://imageshack.us/f/708/errorah.png/ – Jordi

2

您需要添加IgnoreArguments並可另加參數約束上的呼叫「SomeCall」:

bMock.Expect(x => x.SomeCall(new C { Name = "myname" })) 
    .IgnoreArguments() 
    .Constraints(new PropertyConstraint(typeof(C), "Name", 
     Rhino.Mocks.Constraints.Is.Equal("myname"))); 
+0

thanks mate!今天我學到了很好的技巧。這個問題困擾了我好幾個星期。 – Jordi

+1

此語法已過時。您應該使用更新的AAA語法,您不再需要字符串中的屬性名稱。如果忽略下一行中的參數,那麼傳遞新的C就沒有用處。 –