Rhino Mocks - AssertWasCalled: как улучшить нечеткое диагностическое сообщение при неверных аргументах - PullRequest
11 голосов
/ 05 января 2011

ИМХО, 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.

... вы не можете знать, если это не удается, потому что

A. «Write» никогда не вызывается -или-
B. «Write» фактически вызывается, но с неверным аргументом

Если бы B был причиной сбоя, тогда было бы намного яснее, если бы сообщение читалось примерно так:

Rhino.Mocks.Exceptions.ExpectationViolationException: ISomeInterface.Write (string arg): метод был вызван, но с неверными аргументами: ожидается: привет, факт: пока

Могу ли я сам исправить этот недостаток (каким-то образом написав собственные совпадения для Rhino) или мне просто нужно написать ручной макет для этого?

1 Ответ

10 голосов
/ 26 февраля 2011

Я нашел простое решение, используя синтаксис «Соответствия», предоставленный 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;
}

Конечно, это немного неуклюже, но это делает работу. Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

...