Rhino Mocks - AssertWasCalled:如何在不正确的参数时改进不清楚的诊断消息

时间:2011-01-04 22:35:37

标签: c# unit-testing rhino-mocks

恕我直言,当使用AssertWasCalled来验证已使用特定参数调用方法时,犀牛模拟会产生一条不明确的诊断消息。

示例:

interface ISomeInterface
{
    void Write(string s);
}

[TestFixture]
public class SomeTests
{
    [Test]
    public void WriteShouldBeCalledWithCorrectArguments()
    {
        // Arrange
        var mock = MockRepository.GenerateMock<ISomeInterface>();
        var sut = new SomeClass(mock);

        // Act
        sut.DoSomething();

        // Assert
        mock.AssertWasCalled(x => x.Write(Arg<string>.Is.Equal("hello")));
    }
}

现在,如果测试失败并显示此消息......

Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(等于hello);预期#1,实际#0。

...你不知道它是否失败,因为

一个。 “写”永远不会被引用 - 或者 - B.事实上,'Write'被调用,但参数不正确

如果B是导致失败的原因那么如果消息读出的话会更加清楚:

Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(string arg):调用方法但参数不正确:预期:hello,Actual:bye

我可以自己解决这个缺点(通过某种方式为Rhino编写自定义匹配器),还是只需要为此编写一个手动模拟器?

2 个答案:

答案 0 :(得分:10)

我通过使用Rhino提供的“匹配”语法找到了一个简单的解决方案:

[Test]
public void WriteShouldBeCalledWithCorrectArguments()
{
    // Arrange
    var mock = MockRepository.GenerateMock<ISomeInterface>();
    var sut = new SomeClass(mock);

    // Act
    sut.DoSomething();

    // Assert
    mock.AssertWasCalled(x => x.Write(Arg<string>.Matches(s => Equal(s, "hello"))));
}

private static bool Equal(string s1, string s2)
{
    Assert.That(s1, Is.EqualTo(s2), "Unexpected argument");
    return true;
}

当然,这有点笨拙,但它完成了工作。如果有更好的方法,请告诉我。

答案 1 :(得分:0)

您可以使用 GetArgumentsForCallsMadeOn 获取传递的参数并对其进行断言:

var args = mock.GetArgumentsForCallsMadeOn(x => x.Write(null), opt => opt.IgnoreArguments())[0];
Assert.AreEqual("Hello", args[0]):