ASP.net MVC RTM 测试命名规范

8

我正在开发一个asp.net mvc应用程序,并以BDD风格编写我的单元测试。

例如:

当资源文件存在时,GetResource_应返回资源()

但是,当我为控制器编写测试时,通常会有两个同名的方法。一个是没有参数的GET请求,另一个是有参数的POST请求。这里有没有好的命名约定可以区分这两个方法呢?

我能想到的有:

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个回答

4
我使用以下格式,对我非常有效:
[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() {}
}

2

有一个选项,我个人不太喜欢,那就是给控制器动作命名不同的名称,然后使用ActionName属性重新命名它们:

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

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

这本质上是用一个问题(单元测试命名)来替换另一个问题(更难阅读的控制器代码)。尽管如此,您可能会发现这种模式很有吸引力,因为它确实解决了所述问题。


2

我使用与您问题中类似的命名约定,即method_scenario_expected

我认为您应该更详细地阐述“scenario”部分 - 如果您正在传递参数,请让读者知道它们的特殊之处。

请记住,以这种方式命名测试更加“TDD导向”,而不是BDD - BDD测试名称应该涉及规则和“行为”。

如果您觉得当前的命名约定对代码可读性没有帮助 - 请随意尝试并找到适合您的方法。


1

我认为这是一个完美的例子,说明为单元测试制定严格的命名约定是不可取的。

你提出的方案只适用于有两个方法重载的情况:一个带参数,一个不带参数。它无法扩展到具有不同参数的多个重载的情况。

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

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

这使我有灵活性来命名我的测试

SutIsPathResolutionCommand
ExecuteWithNullEvaluationContextWillThrow
ExecuteWillAddDefaultClaimsTransformationServiceWhenNoConnectionServiceIsAvailable

我必须承认,我很少阅读测试的名称。相反,我会阅读它所做的事情的规范(即测试代码)。对我来说,名称并不是那么重要。


0
我可能没有回答你的问题,但我想分享一下我的做法。我不遵循特定的命名约定,但我尝试给出能够解释测试方法试图测试什么的名称。在某些需要更多解释的情况下,我会添加描述 [Test("此测试评估了特定用户回答了多少问题")].

确保测试更易读和快速理解是非常重要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接