Как вы организуете тесты контроллера MVC? - PullRequest
2 голосов
/ 15 апреля 2009

Я ищу полезные советы о том, как люди организуют свои тесты контроллеров.

Например, возьмите функцию «добавить» моего контроллера «Адрес»,

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Add()
{
    var editAddress = new DTOEditAddress();
    editAddress.Address = new Address();
    editAddress.Countries = countryService.GetCountries();

    return View("Add", editAddress);
}

[RequireRole(Role = Role.Write)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
    // save code here
}

Возможно, у меня есть прибор под названием "when_adding_an_address", однако есть два действия, которые мне нужно проверить под этим заголовком ...

Я не хочу вызывать оба действия в моем методе Act() в своем приборе, поэтому я делю устройство пополам, но тогда как мне его назвать?

"When_adding_an_address_GET" и "When_adding_an_address_POST"?

вещи, кажется, быстро запутываются.

Кроме того, как вы справляетесь с утверждениями без состояния / без установки для контроллеров, и как вы организуете их выше? например:

[Test]
public void the_requesting_user_must_have_write_permissions_to_POST()
{
    Assert.IsTrue(this.SubjectUnderTest.ActionIsProtectedByRole(c => c.Add(null), Role.Write));
}

Это пользовательский код, который я знаю, но вы должны понять, что он просто проверяет наличие атрибута фильтра в методе. Дело в том, что он не требует каких-либо Arrange() или Act().

Любые советы приветствуются!

Спасибо

Ответы [ 2 ]

1 голос
/ 12 июня 2010

По моему мнению, вы должны забыть о наименовании ваших тестов после методов, которые вы тестируете. На самом деле тестирование одного метода - странная концепция. Вы должны тестировать одну вещь, которую клиент сделает с вашим кодом. Так, например, если вы можете нажать add с помощью POST и GET, вы должны написать два теста, как вы предлагали. Если вы хотите увидеть, что происходит в определенном исключительном случае, вам следует написать еще один тест.

Обычно я выбираю имена, которые сообщают сопровождающему то, что ему нужно знать в Java:

@Test public void shouldRedirectToGetWhenPostingToAdd(){
    //...
}

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

0 голосов
/ 27 мая 2010

Ну, 13 месяцев спустя и ответов нет. Высокий.

Вот что я делаю сейчас:

/tests/controllers/address/add/get.cs
/tests/controllers/address/add/valid.cs
/tests/controllers/address/add/invalid.cs
...