2

我正在寻找有关人们如何组织控制器测试的整洁建议。

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

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

欢迎任何提示!

谢谢

4

2 回答 2

1

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

我通常会选择能够告诉维护者他需要知道的 Java 内容的名称:

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

您可以使用任何语言执行此操作,并根据需要选择任何 *DD 命名约定,但关键是测试名称应该传达期望和场景。这样你会得到非常小的测试,我认为这是一件好事。

于 2010-06-12T08:17:30.870 回答
0

好吧,13 个月后,没有答案。惊人的。

继承人我现在做什么:

/tests/controllers/address/add/get.cs
/tests/controllers/address/add/valid.cs
/tests/controllers/address/add/invalid.cs
于 2010-05-27T08:59:12.203 回答