5

我想使用 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 将参数检查为“等于”吗?

万分感谢!

4

2 回答 2

11

我建议您使用更简单(且更易于维护)的 AAA 语法。在大多数情况下,严格的模拟比其他任何事情都更痛苦。

使用 比较参数Equals。如果C不覆盖Equals,则通过引用进行比较,并且在您的情况下不匹配。用于Matches以其他方式检查参数。

// 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"));
于 2012-08-24T07:59:32.870 回答
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")));
于 2012-08-24T07:50:00.020 回答