Asp.net mvc ASP.net MVC RTM测试命名约定

Asp.net mvc ASP.net MVC RTM测试命名约定,asp.net-mvc,unit-testing,tdd,testing,bdd,Asp.net Mvc,Unit Testing,Tdd,Testing,Bdd,我正在开发一个asp.NETMVC应用程序,并编写BDD风格的单元测试。 例如 GetResource\u当资源文件存在时\u应返回资源() 但是当我为我的控制器编写测试时,我通常有两个同名的方法。一个没有用于get请求的参数,另一个用于POST。这里有没有人有一个好的命名约定来区分这两者 我能想到: 1. LogIn_WithParameters_ShouldReturnLogInView() LogIn_WithoutParameters_WhenAuthenticationFailed_S

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

GetResource\u当资源文件存在时\u应返回资源()

但是当我为我的控制器编写测试时,我通常有两个同名的方法。一个没有用于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()

有什么意见吗?

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

只有当您有两个方法重载时,您提出的方案才会起作用:一个带参数,另一个不带参数。它不适用于具有多个具有不同参数的重载的场景

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

[Action][Will|Should|Is|...][Result]
这使我能够灵活地命名测试

SutIsPathResolutionCommand
ExecuteWithNullEvaluationContextWillThrow
ExecuteWillAddDefaultClaimsTransformationServiceWhenNoConnectionServiceIsAvailable

我必须承认我很少读考试的名字。相反,我阅读了它的功能规范(即测试代码)。名称对我来说并不重要。

我使用以下格式,这对我来说非常有效:

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

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

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

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

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

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


需要确保的一件事是,测试更具可读性,并且可以快速理解

我使用了与您问题中类似的命名约定,即方法\u场景\u 我认为您应该详细说明“场景”部分——如果您正在传递参数——让读者知道它们的特殊之处

请记住,以这种方式命名测试更为“TDD OREENT”,并且没有BDD-BDD测试名称应该与规则和“行为:”有关

如果您觉得当前的命名约定不利于代码的可读性,请随意尝试并找到适合您的方法