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 に答える