5

我有一个我正在测试的方法。给定某些输入,它应该将失败方法写入记录器(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();
4

1 回答 1

5

编辑

这可以使用以下语法来完成:

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();
    }
}
于 2011-03-14T18:53:29.203 回答