单元测试和SRP(测试方法范围/组织)

时间:2011-07-29 11:21:30

标签: asp.net-mvc unit-testing tdd single-responsibility-principle

说我有一个MVC动作,如:

public ActionResult CustomerRecord(customerId)
{
    if (_currentUser.CanViewCustomer(customerId))
        return View();

    else 
    {
        // user has tried to access an unauthorised record, 
        // should not be here!
        _logger.Log(new SecurityException());
        return View("UnauthorizedAccess");
    }
}

要测试未经授权的访问尝试的情况,应该有多少测试方法?

即。我写一个单一的测试:

CustomerRecord_WithUnauthorizedUser_LogsExceptionAndReturnsUnauthorizedView

或者我会写两个测试:

CustomerRecord_WithUnauthorizedUser_LogsException
CustomerRecord_WithUnauthorizedUser_ReturnsUnauthorizedView

我想问题是技术上控制器违反了SRP,但我不认为这本身就是一个问题(如果你不同意,请纠正我)。我只是不确定它如何映射到测试方法。每个方法的一个测试,或通过该方法的每个单独的一个测试?

2 个答案:

答案 0 :(得分:2)

您的控制器不一定通过执行两个事物来违反SRP - 它仍然只有一个责任(控制)。

在这个具体的例子中,我会警告不要断言进行日志调用 - 如果你取出日志语句,它不会影响你的应用程序的功能。过度指定的单元测试会使它们变得脆弱并且难以维护,这也是我喜欢BDD的原因之一。

如果您必须审核每次失败的尝试,那么我认为这值得进行单元测试,所以如果您正在做的事情,请继续阅读:

一般来说,每单元测试你应该只有一个断言(也许你必须调用一个Assert方法或两个来做一个语义断言) - 基本上因为能够查看失败的名称是很好的在不必查看代码的情况下测试并确切地知道出了什么问题。所以我主张进行两次测试......

答案 1 :(得分:2)

我更喜欢每个测试的一个断言(或者你提出的责任),因为如果出现问题,它会立即清楚代码路径的哪个部分失败了。这假设您以一种在阅读测试结果时可以理解的方式命名您的测试(您的示例)。