ILogger <T> .Log拡張メソッドがMoqを使用して呼び出されたことを確認するにはどうすればよいですか?

Question3r

このサンプルコードをテストするためにxUnitプロジェクトを作成しました

public class ClassToTest
{
    private readonly ILogger<ClassToTest> _logger;

    public ClassToTest(ILogger<ClassToTest> logger)
    {
        _logger = logger;
    }
    
    public void Foo() => _logger.LogError(string.Empty);
}

ロガーのモックインスタンスを作成するためにMoqをインストールしました

public class ClassToTestTests
{
    private readonly ClassToTest _classToTest;
    private readonly Mock<ILogger<ClassToTest>> _loggerMock;
    
    public ClassToTestTests()
    {
        _loggerMock = new Mock<ILogger<ClassToTest>>();
        _classToTest = new ClassToTest(_loggerMock.Object);
    }

    [Fact]
    public void TestFoo()
    {
        _classToTest.Foo();
        
        _loggerMock.Verify(logger => logger.LogError(It.IsAny<string>()), Times.Once);
    }
}

テストを実行すると、このエラーメッセージが表示されます

System.NotSupportedException:サポートされていない式:logger => logger.LogError(It.IsAny()、new [] {})

System.NotSupportedExceptionサポートされていない式:logger => logger.LogError(It.IsAny()、new [] {})拡張メソッド(ここでは:LoggerExtensions.LogError)は、セットアップ/検証式では使用できません。

いくつかの調査の結果、すべてのログメソッドは単なる拡張メソッドであることがわかりました。Moqは拡張メソッドを設定できません。

この問題のために追加のサードパーティパッケージをインストールすることは避けたいと思います。テストに合格するための解決策はありますか?

verbedr

拡張メソッドをモックすることはできません。

嘲笑する代わりに

logger.LogError(...)

インターフェイスメソッドをモックする必要があります

void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);

LogErrorは、実際にはこのようなインターフェイスメソッドを呼び出します

logger.Log(LogLevel.Error, 0, new FormattedLogValues(message, args), null, (state, ex) => state.ToString());

だからあなたはモックする必要があります

 _loggerMock.Verify(logger => logger.Log(It.Is(LogLevel.Error), It.Is(0), It.IsAny<FormattedLogValues>(), It.IsAny<Exception>(), It.IsAny<Func<TState, Exception, string>>()), Times.Once);

免責事項私はコードを確認しませんでした

pinkfloydx33からのコメントの後で編集し、.net50でテスト例を設定し、次の答えに到達しました

最新のフレームワークでは、FormattedLogValuesクラスが内部に作成されています。したがって、これを一般的なMoq.Itメンバーで使用することはできません。しかし、Moqにはこれを行う別の方法があります(この回答は解決策にも言及しています)

このようなロガーへの呼び出しのために

_logger.LogError("myMessage");

このように確認する必要があります

_loggerMock.Verify(logger => logger.Log(
        It.Is<LogLevel>(logLevel => logLevel == LogLevel.Error),
        It.Is<EventId>(eventId => eventId.Id == 0),
        It.Is<It.IsAnyType>((@object, @type) => @object.ToString() == "myMessage" && @type.Name == "FormattedLogValues"),
        It.IsAny<Exception>(),
        It.IsAny<Func<It.IsAnyType, Exception, string>>()),
    Times.Once);

アクセスできないタイプにはIt.IsAnyTypeを使用します。また、検証を制限する必要がある場合は、func <object、type>を追加して、タイプが期待どおりかどうかを確認するか、パブリックインターフェイスにキャストして、パブリックメンバーを検証します。

文字列メッセージといくつかのパラメータを使用する場合は、FormattedLogValues型のオブジェクトをインターフェイスIReadOnlyList <KeyValuePair <string、object?>>にキャストし、さまざまなパラメータの文字列/値を確認する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

.NETCoreコードの単体テストでILogger <T>を提供するにはどうすればよいですか?

分類Dev

ポリモーフィックなメソッド呼び出しで、JVMにscala.Array [T]をJava配列T []として認識させるにはどうすればよいですか?

分類Dev

IEnumerable <T>の拡張メソッドを作成するにはどうすればよいですか?どこで宣言すればいいですか?

分類Dev

パターンマッチングを使用して、Tベースからメソッドを呼び出すにはどうすればよいですか?

分類Dev

ジェネリック型T []を引数として持つメソッドを呼び出すにはどうすればよいですか?

分類Dev

ILogger <T>を挿入すると、毎回新しいロガーが作成されますか?

分類Dev

特定のILogger <T>のアプリケーションインサイトログを見つけるにはどうすればよいですか。

分類Dev

Moqを使用してメソッドが特定の回数呼び出されたことを確認するにはどうすればよいですか?

分類Dev

Moqを使用してメソッドが特定の回数呼び出されたことを確認するにはどうすればよいですか?

分類Dev

Serilogを介して汎用ILogger <T>で使用されるタイプをログに記録します

分類Dev

コンテナが実際にILogger <T>を解決する方法

分類Dev

タイプILoggerのバッキングフィールドですが、タイプILogger <T>の挿入されたパラメータ

分類Dev

Serilogの `ILogger`にエラーが記録されているかどうかを確認することはできますか?

分類Dev

mpz_t番号がGMPを使用して初期化されているかどうかを確認するにはどうすればよいですか?

分類Dev

実行中のT-SQLによって呼び出されたSSISパッケージが終了したかどうかを確認する方法

分類Dev

静的クラスに挿入されたILoggerを取得するにはどうすればよいですか?

分類Dev

Moq:Action <T>引数が空の関数であることを確認するにはどうすればよいですか?

分類Dev

式ツリーを使用して、反映されたFunc <T、T>プロパティを呼び出すにはどうすればよいですか?

分類Dev

Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

分類Dev

C#で、ジェネリックパラメーターFunc <T、TResult>をパラメーターとして持つラムダを受け取る拡張メソッドを作成するにはどうすればよいですか。

分類Dev

Mockitoを使用して、メソッドが特定の引数で呼び出されたことを確認するにはどうすればよいですか?

分類Dev

AzureFunctions-挿入されたILogger <T>ログが表示されない

分類Dev

メソッドがMoqで呼び出されなかったことを確認するにはどうすればよいですか?

分類Dev

メソッドがMoqで呼び出されなかったことを確認するにはどうすればよいですか?

分類Dev

メソッドがMoqで呼び出されなかったことを確認するにはどうすればよいですか?

分類Dev

linq拡張メソッドがmoqで呼び出されていることを確認します

分類Dev

XCTAssertを使用してクラスメソッドが呼び出されていることを確認するにはどうすればよいですか?

分類Dev

ConfigureServicesのサービスにILogger <T>依存関係を挿入する方法-.netcore 2.0

分類Dev

FakeItEasyフレームワークを使用してFunc <T>が呼び出されたかどうかをテストするにはどうすればよいですか?

Related 関連記事

  1. 1

    .NETCoreコードの単体テストでILogger <T>を提供するにはどうすればよいですか?

  2. 2

    ポリモーフィックなメソッド呼び出しで、JVMにscala.Array [T]をJava配列T []として認識させるにはどうすればよいですか?

  3. 3

    IEnumerable <T>の拡張メソッドを作成するにはどうすればよいですか?どこで宣言すればいいですか?

  4. 4

    パターンマッチングを使用して、Tベースからメソッドを呼び出すにはどうすればよいですか?

  5. 5

    ジェネリック型T []を引数として持つメソッドを呼び出すにはどうすればよいですか?

  6. 6

    ILogger <T>を挿入すると、毎回新しいロガーが作成されますか?

  7. 7

    特定のILogger <T>のアプリケーションインサイトログを見つけるにはどうすればよいですか。

  8. 8

    Moqを使用してメソッドが特定の回数呼び出されたことを確認するにはどうすればよいですか?

  9. 9

    Moqを使用してメソッドが特定の回数呼び出されたことを確認するにはどうすればよいですか?

  10. 10

    Serilogを介して汎用ILogger <T>で使用されるタイプをログに記録します

  11. 11

    コンテナが実際にILogger <T>を解決する方法

  12. 12

    タイプILoggerのバッキングフィールドですが、タイプILogger <T>の挿入されたパラメータ

  13. 13

    Serilogの `ILogger`にエラーが記録されているかどうかを確認することはできますか?

  14. 14

    mpz_t番号がGMPを使用して初期化されているかどうかを確認するにはどうすればよいですか?

  15. 15

    実行中のT-SQLによって呼び出されたSSISパッケージが終了したかどうかを確認する方法

  16. 16

    静的クラスに挿入されたILoggerを取得するにはどうすればよいですか?

  17. 17

    Moq:Action <T>引数が空の関数であることを確認するにはどうすればよいですか?

  18. 18

    式ツリーを使用して、反映されたFunc <T、T>プロパティを呼び出すにはどうすればよいですか?

  19. 19

    Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

  20. 20

    C#で、ジェネリックパラメーターFunc <T、TResult>をパラメーターとして持つラムダを受け取る拡張メソッドを作成するにはどうすればよいですか。

  21. 21

    Mockitoを使用して、メソッドが特定の引数で呼び出されたことを確認するにはどうすればよいですか?

  22. 22

    AzureFunctions-挿入されたILogger <T>ログが表示されない

  23. 23

    メソッドがMoqで呼び出されなかったことを確認するにはどうすればよいですか?

  24. 24

    メソッドがMoqで呼び出されなかったことを確認するにはどうすればよいですか?

  25. 25

    メソッドがMoqで呼び出されなかったことを確認するにはどうすればよいですか?

  26. 26

    linq拡張メソッドがmoqで呼び出されていることを確認します

  27. 27

    XCTAssertを使用してクラスメソッドが呼び出されていることを確認するにはどうすればよいですか?

  28. 28

    ConfigureServicesのサービスにILogger <T>依存関係を挿入する方法-.netcore 2.0

  29. 29

    FakeItEasyフレームワークを使用してFunc <T>が呼び出されたかどうかをテストするにはどうすればよいですか?

ホットタグ

アーカイブ