Rhino Mocks,验证所有期望。

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将参数检查为“相等”?

非常感谢!

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"));

嗨,编译器说:“无法将 Lambda 表达式转换为类型 'Rhino.Mocks.Constraints.AbstractConstraint',因为它不是委托类型。”,指向 “x => x.Name = "myname"”。 - Jordi
将赋值符号(=)更正为比较符号(==)。 - Stefan Steinegger
仍然存在同样的问题。我漏掉了什么吗?http://imageshack.us/f/708/errorah.png/ - Jordi
1
重复使用相同的lambda参数名称x。已修复。(y => ...) - Stefan Steinegger

2
您需要在调用“SomeCall”时添加 IgnoreArguments,并可以额外添加参数约束条件。
bMock.Expect(x => x.SomeCall(new C { Name = "myname" }))
    .IgnoreArguments()
    .Constraints(new PropertyConstraint(typeof(C), "Name", 
        Rhino.Mocks.Constraints.Is.Equal("myname")));

谢谢伙计!今天我学到了一个不错的技巧。那个问题困扰了我好几周。 - Jordi
1
这种语法已经过时了。你应该使用更新的AAA语法,在这种语法中,你不再需要在字符串中使用属性名称。如果在下一行忽略参数,那么传递一个新的C是没有用的。 - Stefan Steinegger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接