【问题标题】:Rhino Mocks, VerifyAllExpectationsRhino 模拟,VerifyAllExpectations
【发布时间】:2012-08-24 07:37:50
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: c# unit-testing tdd rhino-mocks


    【解决方案1】:

    我建议您使用更简单(且更易于维护)的 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"));
    

    【讨论】:

    • 您好,编译器说:“无法将 lambda 表达式转换为类型 'Rhino.Mocks.Constraints.AbstractConstraint',因为它不是委托类型。”指向 "x => x.Name = "myname""
    • 修复了赋值等于 (=) 到比较 (==)。
    • 还是同样的问题。我错过了什么? imageshack.us/f/708/errorah.png
    • 重复使用相同的 lambda 参数名称 x。解决它。 (y => ...)
    【解决方案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")));
    

    【讨论】:

    • 谢谢老兄!我今天学到的好技巧。这个问题困扰了我好几个星期。
    • 此语法已过时。您应该使用较新的 AAA 语法,不再需要字符串中的属性名称。如果忽略下一行中的参数,则传递新的 C 是没有用的。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多