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


当使用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。

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

A.'写'永远不会被调用 - 或 -
B.事实上,“写”是用不正确的参数调用的

如果B是失败的原因那么如果消息读取的内容会更加清晰:

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

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


8063
2018-01-04 22:35


起源

考虑尝试Moq和/或进行基于状态的测试。 code.google.com/p/moq - TrueWill
不幸的是,Moq也存在同样的问题。 - Chris


答案:


我通过使用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;
}

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


10
2018-02-26 14:15



你错过了这一部分:'预计:你好,实际:再见'来自OP。 - jcollum