我想跟踪一个使用Rhino Mocks的方法的调用.我们假设我有这个代码:
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而失败,因为Rhino Mocks框架检测到2个不同的C类.
如果测试对象在被测方法中创建了对象参数,如何检查调用?有没有机会告诉Rhino Mocks将参数检查为“Equals”?
万分感谢!
解决方法
我建议您使用更容易(也更易于维护)的AAA语法.在大多数情况下,严格的嘲笑比其他任何事情更痛苦.
使用Equals比较参数.如果C不重写等于,则按引用进行比较,在您的情况下不匹配.使用匹配以其他方式检查参数.
// 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"));