TDD контроллер с ASP.NET MVC 2, NUnit и Rhino Mocks

Как будет выглядеть простой модульный тест, подтверждающий существование определенного контроллера, если я использую Rhino Mocks, NUnit и ASP.NET MVC 2? Я пытаюсь осмыслить концепцию TDD, но не могу понять, как будет выглядеть простой тест, такой как «Контроллер XYZ существует». Кроме того, как будет выглядеть модульный тест для проверки результата действия в представлении?


person Keith Adler    schedule 24.03.2010    source источник
comment
Что еще более важно, я использую ASP.NET MVC 2.   -  person Keith Adler    schedule 24.03.2010
comment
Должны ли мы предполагать, что ваши контроллеры зарегистрированы во время выполнения? В этом случае разве вам не нужен интеграционный тест вместо модульного?   -  person Todd Smith    schedule 24.03.2010


Ответы (2)


Подтвердите, что контроллер существует

Наличие модульных тестов его действий - убедительное предположение о существовании контроллера, что приводит нас к следующему:

Как будет выглядеть модульный тест для проверки результата действия вне представления

Вот пример:

public class HomeController: Controller
{
    private readonly IRepository _repository;
    public HomeController(IRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        var customers = _repository.GetCustomers();
        return View(customers);
    }
}

И соответствующий модульный тест:

[Test]
public void HomeController_Index_Action_Should_Fetch_Customers_From_Repo()
{
   // arrange
   var repositoryStub = MockRepository.GenerateStub<IRepository>();
   var sut = new HomeController(repositoryStub);
   var expectedCustomers = new Customer[0];
   repositoryStub
       .Stub(x => x.GetCustomers())
       .Return(expectedCustomers);

   // act
   var actual = sut.Index();

   // assert
   Assert. IsInstanceOfType(typeof(ViewResult), actual);
   var viewResult = (ViewResult)actual;
   Assert.AreEqual(expectedCustomers, viewResult.ViewData.Model);
}

MVCContrib имеет несколько замечательных функций, позволяющих имитировать HttpContext, а также проверьте свои маршруты.

person Darin Dimitrov    schedule 24.03.2010

Почему вы хотите проверить, существует ли контроллер? Что вам нужно сделать, так это протестировать поведение контроллера. Ваш контроллер - это тестируемый код, и вы возлагаете на него определенные ожидания, а затем утверждаете, оправданы ли ожидания.

Существует много пошаговых руководств о том, как выполнять TDD с помощью ASP.NET MVC. Вы можете начать например здесь

http://codebetter.com/blogs/jeffrey.palermo/archive/2008/03/09/this-is-how-asp-net-mvc-controller-actions-should-be-unit-tested.aspx

person Tomasz Jaskuλa    schedule 24.03.2010
comment
Я видел это, но это неправильно. Никогда не следует утверждать более одного раза за тест. Кроме того, он больше ориентирован на тестирование репозитория, чем на простой тест контроллера. - person Keith Adler; 24.03.2010
comment
Одно утверждение на тест? Это может иметь смысл в каком-то контексте в далекой галактике, но для тестов контроллера это не имеет особого смысла, imho. - person Todd Smith; 24.03.2010