2016-09-20 1 views
10

Я хочу проверить, что некоторые журналы зарегистрированы. Я использую ядро ​​asp.net встроенный ILogger, и ввести его с ядром asp.net встроенным в DI:Как протестировать встроенный ядро ​​asp.net Иглогер

private readonly ILogger<InvoiceApi> _logger; 

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

тогда я использую это нравится: _logger.LogError("error));

Я пытался дразнить его (с MOQ), как обычно:

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

и внедрить это в сервис для тестирования по:

new InvoiceApi(MockLogger.Object); 

затем Trie d проверить:

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

но бросить:

Invalid проверить на невиртуальном (переопределение в VB) член: т => m.LogError

Итак, как Я проверяю, что эти журналы зарегистрированы?

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные детали, чтобы выделить именно то, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу [Как спросить] (http://stackoverflow.com/help/how-to-ask), чтобы помочь прояснить этот вопрос. – Nkosi

+0

В конце я добавил строку. Теперь вопрос ясен? – arielorvits

+0

Вы не показываете, в каком контексте вы используете регистратор. Покажите тестируемую систему/метод. покажите, как вводится и используется логгер. – Nkosi

ответ

17

Как уже сказал @ Nkosi've, вы не можете издеваться над методом расширения. Что вы должно mock, is the ILogger.Log method, которое LogError calls into. Это делает код проверки немного неуклюжим, но он должен работать:

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

(Не уверен, если это компилируется, но вы получите суть)

+1

Он делает! Единственное, что нужно добавить 'It.IsAny ()' в качестве предпоследнего аргумента. –

+0

Спасибо @khellang, используя .Log вместо .LogError работает! –

1

LogError - метод расширения (статический), а не метод экземпляра. Вы не можете «напрямую» имитировать статические методы (следовательно, метод расширения) с издевательской структурой, поэтому Moq не может издеваться и, следовательно, проверять этот метод. Я видел предложения в Интернете об адаптации/упаковке целевого интерфейса и выполнении ваших макетов, но это означало бы перезаписывать, если вы использовали по умолчанию ILogger во всем своем коде во многих местах. Вам нужно было бы создать 2 новых типа, один для класса-оболочки, а другой для макетируемого интерфейса.

1

Я написал short article показывая различные подходы, включая издевательствование базового метода Log(), как описано в других ответах здесь. Статья включает a full GitHub repo with each of the different options. В конце концов, моя рекомендация - использовать собственный адаптер, а не работать напрямую с типом ILogger, если вам нужно проверить, что он вызван.

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

Смежные вопросы