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

Как би изглеждал прост модулен тест за потвърждаване, че определен контролер съществува, ако използвам Rhino Mocks, NUnit и ASP.NET MVC 2? Опитвам се да обмисля концепцията за TDD, но не мога да разбера как би изглеждал прост тест като „Controller XYZ Exists“. Освен това, как би изглеждал единичният тест за тестване на резултат от действие извън изглед?


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