Как вы пишете тесты для тестирования функций с переменными возвращаемыми значениями? - PullRequest
3 голосов
/ 27 января 2009

У меня есть простая функция, подобная этой:

    function CreateFileLink()
    {
            global $Username;

            return date("d-m-y-g-i");
    }

Как вы пишете код для проверки функции, подобной той, где возвращаемые данные являются переменными?

Ответы [ 5 ]

3 голосов
/ 27 января 2009

Вы можете проверить это, если сможете каким-то образом получить контроль над этой функцией date (). Например, в этом случае вас заботит только то, что функция даты вызывается с помощью «d-m-y-g-i»; вы действительно не заботитесь о выходе этого. Может быть что-то вроде:

function CreateFileLink(DateProvider dateProvider)
{
        global $Username;

        return dateProvider.date("d-m-y-g-i");
}

Извините, я даже не знаю, на каком это языке, но, надеюсь, вы поймете мою точку зрения. В рабочем коде вы бы назвали это, выполнив:

DateProvider standardDateProvider = new DateProvider() { Date date(String str) { return date(str); } };
CreateFileLink(standardDateProvider);

Но в вашем тесте вы можете предоставить альтернативную реализацию, которая выдаст ошибку, если ввод не соответствует вашим ожиданиям:

DateProvider mockProvider = new DateProvider() 
{
    Date date(String str) 
    {
        if(str != "d-m-y-g-i") throw Exception();
        return "success";
    }
}
2 голосов
/ 27 января 2009

Есть Google Tech Talk хорошо о внедрение зависимости .

По сути, идеальный способ создания тестируемого кода - сделать все ваши зависимости явными, чтобы вы не попали в ситуации, когда двойной вызов одной и той же функции может привести к двум разным ответам.

В случае дат и т.п., если вы создаете «системный объект», который вы явно передаете в свою функцию, вы можете затем создать «тестовый системный объект», который можно использовать для тестирования и который будет возвращать фиксированные значения, а не возвращая текущую дату

2 голосов
/ 27 января 2009

Что нужно сделать вашим модульным тестам, это настроить среду для правильной работы этой функции, другими словами, вы имитируете, как если бы система работала, устанавливая другие переменные, тогда вы ДОЛЖНЫ знать, что она вернет. основанный на том, как ваш модульный тест установил эти переменные (если, конечно, возвращаемое значение не является случайным числом, в этом случае все, что вы можете сделать, как предположил Рэндольфо, это убедиться, что оно не выдает).

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

0 голосов
/ 27 января 2009

Похоже, что единственный тест, который вы можете запустить с этой функцией, состоит в том, что она не выдает исключение. Нет необходимости проверять возвращаемые данные, так как они генерируются внешней сущностью (функция date ()).

0 голосов
/ 27 января 2009

Ну, если вы используете модульный тест, вы знаете, в какой день, месяц и год вы тестируете функцию.

Итак, вызовите функцию. У вас есть текущее время (при запуске теста). Вычтите текущее время из времени функции. Разница должна быть очень маленькой (например, 2 секунды).

Если бы разница была больше, я бы провалил тест. (в зависимости от скорости вашей системы, конечно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...