wake-up-neo.com

So testen Sie den integrierten Aspog-Kern von Ilogger

Ich möchte einige protokollierte Protokolle überprüfen. Ich verwende den integrierten aspog-Kern von ILogger und injiziere ihn mit dem integrierten asp.net-Kern-DI: 

private readonly ILogger<InvoiceApi> _logger;

public InvoiceApi(ILogger<InvoiceApi> logger)
{
    _logger = logger;
}

dann benutze ich es wie: _logger.LogError("error));

Ich habe versucht, es wie üblich (mit moq) zu verspotten: 

MockLogger = new Mock<ILogger<InvoiceApi>>();

und injizieren Sie dies in den Dienst für den Test von: 

new InvoiceApi(MockLogger.Object);

dann versucht zu überprüfen:

MockLogger.Verify(m => m.LogError(It.Is<string>(s => s.Contains("CreateInvoiceFailed"))));

aber es werfen: 

Ungültige Überprüfung für ein nicht virtuelles Mitglied (in VB überschreibbar): m => m.LogError

Wie kann ich also überprüfen, ob diese Protokolle protokolliert werden?

21
arielorvits

Wie @ Nkosi bereits gesagt hat, können Sie sich nicht mit einer Erweiterungsmethode verspotten. Was Sie sollte mock, ist die ILogger.Log-Methode , die LogError in aufruft. Der Verifizierungscode wird dadurch etwas unübersichtlich, sollte jedoch funktionieren:

MockLogger.Verify(
    m => m.Log(
        LogLevel.Error,
        It.IsAny<EventId>(),
        It.Is<FormattedLogValues>(v => v.ToString().Contains("CreateInvoiceFailed")),
        It.IsAny<Exception>(),
        It.IsAny<Func<object, Exception, string>>()
    )
);

(Nicht sicher, ob dies kompiliert wird, aber Sie erhalten den Gist)

46
khellang

Ich habe einen kurzen Artikel geschrieben, der eine Vielzahl von Ansätzen zeigt, einschließlich des Verspottens der zugrunde liegenden Log () - Methode, wie in den anderen Antworten beschrieben. Der Artikel enthält ein vollständiges GitHub-Repo mit jeder der verschiedenen Optionen . Am Ende empfehle ich Ihnen, Ihren eigenen Adapter zu verwenden, anstatt direkt mit dem Typ ILogger zu arbeiten, wenn Sie testen müssen, ob er aufgerufen wird.

https://ardalis.com/testing-logging-in-aspnet-core

4
ssmith

LogError ist eine Erweiterungsmethode (statisch) und keine Instanzmethode. Sie können statische Methoden (also Erweiterungsmethoden) mit einem Mocking-Framework nicht "direkt" verspotten, daher kann Moq diese Methode nicht nachahmen. Ich habe online Vorschläge zum Anpassen/Einwickeln der Zielschnittstelle und zum Ausführen Ihrer Mocks gesehen. Dies würde jedoch das erneute Schreiben bedeuten, wenn Sie an vielen Stellen in Ihrem Code die Standardvariable ILogger verwendet haben. Sie müssten zwei neue Typen erstellen, einen für die Wrapper-Klasse und den anderen für die mockbare Schnittstelle.

1
Nkosi