ASP.NET в MVC ТДД (в xUnit) - не диспетчер конфигураций.AppSettings без причины


Я пытаюсь ознакомиться с концепцией TDD и написал первый тест, что его" акт " часть выглядит следующим образом:

repositoryStub = new Mock<IMyRepository>();
var sut = new MyController(repositoryStub.Object);
var result = sut.Index() as ViewResult;

Контроллер (MyController), который я создаю в конечном итоге (глубоко внутри), использует ConfigurationManager.AppSettings, создавая модель представления. Создание экземпляра контроллера завершается неудачей на линии, которая пытается прочитать из интернета.Config, но, очевидно, выполняется как ожидалось, если проект просто выполняется из IDE. Я читаю константу из интернета.конфигурационный файл, который не должен влиять на тест и его не было ожидается, что он потерпит неудачу после вызова из другого (MyProject.Test) проекта.

Мой вопрос к вам, ребята, как преодолеть это препятствие?

Я не знаю, имеет ли это значение здесь, но на всякий случай я использую xUnit для TDD. Спасибо!
1 2

1 ответ:

Вам нужно понять, что конфигурация, которую вы используете в глубине, является такой же зависимостью, как и IMyRepository. Вы вводите репозиторий через абстрактный контракт (интерфейс). Почему то же самое не делается для конфигурации? Быстрым и наивным решением было бы создать интерфейс IConfiguration и реализовать его, просто делегировав вызовы ConfigurationManager. Ваш конструктор будет выглядеть следующим образом:

public class MyController(IMyRepository repository, IConfiguration configuration)

О чем это нам говорит? Ну, к сожалению, не очень много. Тот факт, что контроллер требует настройки, очень важен. неопределенный. Реальный вопрос заключается в том, какой точный параметр из конфигурации ему нужен? Вам нужно определить именно этот параметр, и это реальная зависимость, которую вы хотите ввести. Рассмотрим:

  • MyController(IMyRepository repository, IConfiguration configuration)
  • MyController(IMyRepository repository, int serviceCallTimeoutSeconds)
  • MyController(IMyRepository repository, string serviceAccessKey)
Какой из них лучше передает свое предназначение? Чем больше ваш контроллер ориентирован на одну функцию, тем меньше параметров он должен использовать. Ваша проблема может быть не там, где вы думаете.