ASP.net MVC RTM测试命名约定

时间:2009-09-30 11:15:41

标签: asp.net-mvc unit-testing tdd testing bdd

我正在开发一个asp.net mvc应用程序并编写我的单元测试BDD样式。 例如

  

GetResource_WhenResourceFileExists_ShouldReturnResources()

但是当我为我的控制器编写测试时,我通常有两个同名的方法。一个没有获取请求的参数,一个没有用于帖子。有没有人在这里有一个很好的命名约定来区分这两者?

我能想到:

1.
LogIn_WithParameters_ShouldReturnLogInView()
LogIn_WithoutParameters_WhenAuthenticationFailed_ShouldReturnLogInView()
LogIn_WithoutParameters_WhenAuthenticationPassed_ShouldReturnProfileRedirect()

2.
LogIn_Get_ShouldReturnLogInView()
LogIn_Post_WhenAuthenticationFailed_ShouldReturnLogInView()
LogIn_Post_WhenAuthenticationPassed_ShouldReturnProfileRedirect()

3.
LogIn_ShouldReturnLogInView()
LogIn_WhenCalledWithParametersAndAuthenticationFailed_ShouldReturnLogInView()
LogIn_WhenCalledWithParametersAndAuthenticationPassed_ShouldReturnProfileRedirect()

有什么意见吗?

5 个答案:

答案 0 :(得分:3)

我使用以下格式,对我来说效果很好:

[TestFixture]    
public class Log_in_with_parameters_should
{
    [Test]
    public void Return_the_log_in_view() {}
}

[TestFixture]    
public class Log_in_without_parameters_should
{
    [Test]
    public void Return_the_log_in_view_when_the_authentication_failed() {}

    [Test]
    public void Redirect_to_the_profile_when_the_authentication_passed() {}
}

答案 1 :(得分:1)

我认为这是一个完美的例子,说明为什么单元测试的严格命名约定没有吸引力。

您提出的方案仅在您有两个方法重载时才有效:一个有一个,一个没有参数。它没有扩展到具有多个具有不同参数的重载的情况。

我个人更喜欢更宽松的命名约定,可以概括为

[Action][Will|Should|Is|...][Result]

这使我可以灵活地命名我的测试

SutIsPathResolutionCommand
ExecuteWithNullEvaluationContextWillThrow
ExecuteWillAddDefaultClaimsTransformationServiceWhenNoConnectionServiceIsAvailable

我必须承认,我很少读到测试的名称。相反,我读了它的作用规范(即测试代码)。这个名字对我来说并不重要。

答案 2 :(得分:1)

我不是特别喜欢的一个选项是给控制器操作不同的名称,但是然后使用ActionName属性重命名它们:

public ActionResult Login() {
    // ... code ...
    return View();
}

[HttpPost]
[ActionName("Login")]
public ActionResult LoginPost(... some params ...) {
    // ... more code ...
    return View();
}

这基本上将一个问题(单元测试命名)替换为另一个问题(更难读取控制器代码)。然而,您可能会发现这种模式很有吸引力,因为它确实解决了所述问题。

答案 3 :(得分:1)

我对你问题中的一个使用类似的命名约定,即 method_scenario_expected 我认为你应该详细说明“情景”部分 - 如果你传递参数 - 让读者知道什么是关于它们的特殊情况。

请记住,以这种方式命名测试更多是“TDD oreinted”,没有BDD - BDD测试名称应该是关于规则和“行为:。

如果您认为当前的命名约定不会影响代码的可读性 - 请随意试验并找到适合您的方法。

答案 4 :(得分:0)

我可能没有回答你的问题,但我想分享我的所作所为。 我没有遵循特定的命名约定,但我尝试给出解释测试方法试图测试的名称。我需要更多解释的一些情况我添加说明[测试(“此测试评估特定用户回答了多少问题”)]。

要确保的一件事是测试更具可读性且易于理解。