У меня есть интерфейс, который используется в контроллере MVC, который получает некоторые данные. Для того, чтобы сохранить его простым интерфейсом до сих пор выглядит примерно так:Интерфейс модуля тестирования при реализации
public interface IDataProvider
{
DataModel GetData();
}
У меня есть соответствующие модульные тесты для этого интерфейса, где он называется в действии. Однако в реальной реализации это вызовет веб-службу, которая, конечно же, может вызвать исключение, поэтому, если это так, я хочу написать тест, чтобы гарантировать, что я зарегистрирую сообщение, если возникла ошибка.
Для этого у меня есть интерфейс регистратора, который на самом деле является интерфейсом для NLog под названием ILogger. Я мог бы это сделать:
public interface IDataProvider
{
DataModel GetData(ILogger logger);
}
Это позволило бы мне запустить модульные тесты для регистратора, что делает его приятным и простым. Однако я не думаю, что это правильный способ сделать это, потому что регистратор действительно не связан с этим методом. Кроме того, если я начну добавлять другие методы к этому интерфейсу, которые мне нужны для ведения журнала, тогда мне придется включить регистратор в параметр всех этих методов.
Лучший способом я могу думать прямо сейчас включить регистратор в конструкторе моей реализации, которые могли бы выглядеть следующим образом:
public class DataProvider : IDataProvider
{
private readonly ILogger _logger;
public DataProvider(ILogger logger)
{
_logger = logger;
}
public DataModel GetData()
{
// CODE GOES HERE
}
}
Однако это означает, что я не могу проверить регистратор в моих модульных тестах , Каков наилучший способ достичь этого, чтобы я мог оставить регистратор отдельно от метода и сделать его пригодным для проверки?
Буду признателен за любую помощь, спасибо.
EDIT:
Я понимаю, что я пропустил блок кода тестирования здесь является то, что я имею в виду:
На данный момент я гарантируя, что GetData называется в моем действии этот путь:
var controller = new DataController(_dataProvider.Object);
controller.Index();
_dataProvider.Verify(dataProvider => dataProvider.GetData());
То, что я хотел бы сделать, это то же самое, что и для регистратора, но только в том случае, если исключение выбрано следующим образом:
_dataProvider.Setup(dataProvider => dataProvider.GetData()).Throws<WebException>();
var controller = new DataController(_dataProvider.Object);
controller.Index();
_logger.Verify(logger => logger.ErrorException(It.IsAny<string>(), It.IsAny<Exception>());
Очевидно, что регистратор будет предоставлен поставщику данных в настройке. Надеюсь, это будет немного более разумным.
Просьба пояснить это: _Однако это означает, что я не могу проверить регистратор в своих модульных тестах. _ –
За вопрос, говорящий о блочном тесте, вы не показываете ни одного фрагмента тестового кода. – manojlds
Используя фальшивую фреймворк, я могу гарантировать, что вызывается журнал, если я передам его в параметр метода. Я не могу этого сделать, если у меня есть только регистратор, переданный в конструктор реализации, потому что я издеваюсь над объектами в своих модульных тестах. – Serberuss