Как управлять контейнерами IoC в тестах? - PullRequest
0 голосов
/ 27 мая 2010

Я очень плохо знаком с тестированием и контейнерами IoC и имею два проекта:

  • MySite.Website (MVC)
  • MySite.WebsiteTest

В настоящее время у меня есть контейнер IoC на моем веб-сайте.Должен ли я воссоздать другой контейнер IoC для моего теста?Или есть способ использовать IoC в обоих?

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

Когда у вас есть контейнер IoC, надеюсь, у вас также будет происходить какое-то внедрение зависимостей - будь то через конструктор или сеттер.

Суть модульного тестирования состоит в том, чтобы тестировать компоненты изолированно, и выполнение DI помогает этому. Вам нужно выполнить модульное тестирование каждого класса, создав его вручную и передав ему необходимые зависимости, а не полагайтесь на контейнер для его создания.

Суть этого проста. Вы хотите максимально изолировать SUT (тестируемую систему). Если ваше SUT использует другой класс и IoC для его внедрения, вы действительно тестируете три системы, а не одну.

Возьмите следующий пример:

public class ApiController : ControllerBase {

  IRequestParser m_Parser;

  public ApiController(IRequestParser parser) {
    m_Parser = parser;
  }

  public ActionResult Posts(string request) {
    var postId = m_Parser.GetPostId(request);
  }
} 

Конструктор ApiController является конструктором зависимостей и будет вызываться контейнером IoC во время выполнения. Однако во время теста вы хотите смоделировать интерфейс IRequestParser и создать контроллер вручную.

[Test]
public void PostsShouldCallGetPostId() {
  //use nmock for mocking
  var requestParser = m_Mocks.NewMock<IRequestParser>();
  //Set up an expectation that Posts action calls GetPostId on IRequestParser
  Expect.Once.On(requestParser).Method("GetPostId").With("posts/12").Will(Return.Value(0));
  var controller = new ApiController(requestParser);
  controller.Posts("posts/12");
}
0 голосов
/ 28 мая 2010

Тестирование - это реальная реализация. Поэтому обычно вы не должны использовать IOC в своих модульных тестах. В случае, если вам действительно это нужно (один компонент зависит от другого), используйте интерфейс для изоляции взаимодействия и используйте макетную библиотеку (Moq хорош), чтобы смоделировать ее и выполнить тестирование.

Единственный шанс увидеть контейнер IOC, необходимый для тестирования, - это интеграционное тестирование.

...