2012-08-24 41 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就没有用处。 –