Как проверить, что с FakeItEasy произошел вызов любой перегрузки? - PullRequest
4 голосов
/ 09 марта 2011

У меня есть метод, который я тестирую. Учитывая определенные входные данные, он должен записать метод сбоя в логгер (ILogger). Интерфейс имеет несколько перегрузок для Log (), а также некоторые свойства (например, уровень ведения журнала). Я издеваюсь над регистратором, используя FakeItEasy.

Я хочу утверждать, что произошел вызов Log (). Однако мне все равно, какая конкретная перегрузка привыкла. Как я могу это сделать?

Мои идеи:

// Doesn't work, since a different overload (with more parameters) is used.
A.CallTo(() => mockLogger.Log(null)).WithAnyArguments().MustHaveHappened();

// "Works", but if the code were to call something else on the logger
// (ex. change the logging level), this would also pass!
Any.CallTo(mockLogger).MustHaveHappened();

1 Ответ

5 голосов
/ 14 марта 2011

Редактировать

Это можно сделать с помощью следующего синтаксиса:

A.CallTo(logger).Where(x => x.Method.Name == "Log").MustHaveHappened()

Исходный ответ

Там нетпростой способ сделать это, и - поправьте меня, если я ошибаюсь - я не думаю, что есть какая-то насмешливая структура.

При том, что есть - не такой простой - способ сделать это при условиив примере ниже.

public interface ILogger
{
    void Log(string value);
    void Log(object value);
}

public class LoggerTests
{
    public void FakeGetCallsExample()
    {
        var logger = A.Fake<ILogger>();

        logger.Log("whatever");

        var callsToLog = Fake.GetCalls(logger).Where(x => x.Method.Name.Equals("Log"));

        // Asserting with NUnit.
        Assert.That(callsToLog(), Is.Not.Empty);
    }

    // The following does not work as of now but I'll seriously consider
    // implementing it:
    public void AnyCallToWithCallSpecificationExample()
    {
        var logger = A.Fake<ILogger>();

        logger.Log("whatever");

        // I would add a "filtering" method to the Any.CallTo-syntax:
        Any.CallTo(logger).WhereCallMatches(x => x.Method.Name.Equals("Log")).MustHaveHappened();

        // It would also enable an extension method:
        Any.CallTo(logger).ToMethodNamed("Log").MustHaveHappened();
    }
}
...