2016-09-20 33 views
10

Chcę zweryfikować niektóre logi zalogowane. Używam rdzeń asp.net wbudowany ILogger i wstrzyknąć go z rdzeniem asp.net wbudowanym DI:Jak przetestować wbudowany rdzeń asp.net Ilogger

private readonly ILogger<InvoiceApi> _logger; 

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

potem używać go jak: _logger.LogError("error));

Próbowałem go wyśmiewać (z MOQ) jak zwykle:

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

i wstrzykiwać w usłudze do testów:

new InvoiceApi(MockLogger.Object); 

następnie trie d zweryfikować:

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

ale rzucać:

Nieprawidłowy zweryfikować na nie-wirtualnej (VB) w przeciążać użytkownika: m => m.LogError

Tak, jak można Weryfikuję logowane te logi?

+0

Proszę o wyjaśnienie konkretnego problemu lub dodać dodatkowe szczegóły, aby zaznaczyć dokładnie to, czego potrzebujesz. Jak jest napisane, trudno powiedzieć dokładnie, o co prosisz. Zobacz stronę [How to Ask] (http://stackoverflow.com/help/how-to-ask), aby uzyskać pomoc w wyjaśnieniu tego pytania. – Nkosi

+0

Dodałem wiersz na końcu. Czy teraz pytanie jest jasne? – arielorvits

+0

Nie wyświetlasz w jakim kontekście używasz rejestratora. Pokaż testowany system/metodę. pokaż, w jaki sposób rejestrator jest wstrzykiwany i wykorzystywany. – Nkosi

Odpowiedz

17

Jak już powiedział @ Nkosi've, nie można kpić z metody rozszerzenia. To, co musisz , powinno być fałszywe, to the ILogger.Log method, które LogError calls into. To sprawia, że ​​kod weryfikacyjny nieco niezgrabne, ale to powinno działać:

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>>() 
    ) 
); 

(Nie wiem, czy to kompiluje, ale masz sedno)

+1

To robi! Jedyną rzeczą jest dodanie 'It.IsAny ()' jako argumentu przedostatniego. –

+0

Dzięki @khellang przy użyciu .Log zamiast .LogError działa! –

1

LogError jest metodą rozszerzenia (statyczną) a nie metodą instancji. Nie można "bezpośrednio" symulować metod statycznych (stąd metoda rozszerzania) za pomocą szyderczych ram, w związku z czym Moq nie jest w stanie udawać, a zatem weryfikować tej metody. Widziałem sugestie online dotyczące adaptacji/owijania interfejsu docelowego i robienia na tym twoich mocków, ale to oznaczałoby przepisanie, jeśli używałbyś domyślnego ILogger w całym kodzie w wielu miejscach. Będziesz musiał utworzyć 2 nowe typy, jeden dla klasy opakowania, a drugi dla interfejsu z możliwością zarządzania.