2009-04-15 77 views
2

我正在寻找关于人们如何组织他们的控制器测试的整洁建议。你如何组织你的MVC控制器测试?

例如,把我的“地址”控制器的“添加”功能,

[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" and "When_adding_an_address_POST"

事情似乎越来越乱,很快。

另外,你如何处理控制器的无状态/ setupless断言,以及你如何安排这些与上述?例如:

[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()

欢迎任何提示!

谢谢

回答

0

好吧,13个月后,没有答案。真棒。

继承人什么我现在做的事:

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

在我看来,你应该忘记你正在测试的方法命名后,你的测试。实际上,测试单一方法是一个奇怪的概念。你应该测试一个客户端将用你的代码做的一件事情。因此,例如,如果您可以用POST和GET命中添加,则应该按照您的建议编写两个测试。如果你想看看在某些特殊情况下会发生什么,你应该写另一个测试。

我通常会选择那些讲一个维护者,他需要在Java中知道的名字:

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

您可以用任何语言做到这一点,随便选* DD的命名约定,如果你喜欢,但问题是,测试名称应该表达期望和场景。你会以这种方式进行非常小的测试,我认为这是一件好事。