модульное тестирование и SRP (область применения метода тестирования / организация) - PullRequest
0 голосов
/ 29 июля 2011

Скажите, что у меня есть 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");
    }
}

Чтобы проверить случай попытки несанкционированного доступа, сколько должно быть методов проверки?

т.е. я пишу одинtest:

CustomerRecord_WithUnauthorizedUser_LogsExceptionAndReturnsUnauthorizedView

или я пишу два теста:

CustomerRecord_WithUnauthorizedUser_LogsException
CustomerRecord_WithUnauthorizedUser_ReturnsUnauthorizedView

Я думаю, проблема в том, что технически контроллер нарушает SRP, но я не вижу в этом проблемысам по себе (пожалуйста, поправьте меня, если вы не согласны).Я просто не уверен, как это сопоставить с методами тестирования.Один тест на ответственность метода или один тест на один маршрут через метод?

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Я предпочитаю по одному утверждению на тест (или ответственность, как вы выразились), потому что сразу становится ясно, какая часть пути кода потерпела неудачу, если возникла проблема.Это предполагает, что вы называете свои тесты (ваши примеры делают) таким образом, чтобы это было понятно при чтении результатов ваших тестов.

2 голосов
/ 29 июля 2011

Ваш контроллер не обязательно нарушает SRP, выполняя две вещи - он все еще имеет только одну ответственность (контроль).

В этом конкретном примере яЯ бы предостерег от утверждения о том, что вызов журнала сделан - это не повлияет на функциональность вашего приложения, если вы уберете оператор журнала.Из-за чрезмерных спецификаций юнит-тестов они становятся хрупкими и неудобными для обслуживания, что является одной из причин, по которым я так люблю BDD.

Если вам приходилось проверять каждую неудачную попытку, тогда, я думаю, это стоит единицытестирование, так что если это то, что вы делаете, то читайте дальше:

В общем, у вас должно быть только одно утверждение (возможно, вам придется вызвать метод Assert или два, чтобы сделать одно семантическое утверждение) на единицуtest - в основном потому, что приятно иметь возможность посмотреть на название проваленного теста и точно знать, что пошло не так, без необходимости смотреть на код.Так что я бы выступил за проведение двух тестов ...

...