我正在开发一个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()
有什么意见吗?
答案 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)
我可能没有回答你的问题,但我想分享我的所作所为。 我没有遵循特定的命名约定,但我尝试给出解释测试方法试图测试的名称。我需要更多解释的一些情况我添加说明[测试(“此测试评估特定用户回答了多少问题”)]。
要确保的一件事是测试更具可读性且易于理解。