Статьи

Пример тестового исправления ошибок


К сожалению, многие люди до сих пор не используют подход, основанный на тестировании, во время разработки.
Это печально, учитывая множество
преимуществ, которые дают вам автоматические тесты . Одним из моих любимых является регрессионное тестирование. Так как я только что обнаружил ошибку в моей кодовой базе, я воспользуюсь возможностью, чтобы быстро документировать подход исправления ошибок, который я обычно применяю.

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

вступление

В основном я определил следующую функцию в моем файле ajax.js нашей библиотеки расширений JavaScriptMVC .

$.Model.findAllPaged = function (params, currentPage, pageSize, success, error) {
    return $.ajax({
        url: this.resolveUrl(this.baseUrl || this.shortName),
        type: "GET",
        dataType: "json " + resolveClassNameForConverter(this.shortName) + ".models", //"account.models" for autowiring
        data: $.extend(params, { currentPage: currentPage, pageSize: pageSize }),
        success: success,
        error: error,
        fixture: "-restFindAll" // uses $.fixture.restDestroy for response.
    });
};


Эта функция переносит вызов с поддержкой подкачки на наш серверный API. Это может быть вызвано следующим образом:

Test.PersonAccount.findAllPaged(
   {},
   currentPage,
   numPages,
   function (resultData) { ... },
   function (error) { ... });


Довольно понятно.

Создать провальный тест

Ошибка в основном в
строке 6 функции findAllPaged, как упоминалось в моем
предыдущем посте . Таким образом, первый шаг
перед тем, как даже коснуться глючного кода, — создать
неудачный тест. Это очень важно, так как

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

Для теста я использую
QUnit , написанный командой jQuery и уже включенный по умолчанию в JavaScriptMVC. Тест выглядит следующим образом:

test("Calling Model.findAllPaged should not modify the passed parameter object", 1, function () {
    //arrange
    $.fixture["-restFindAll"] = function (settings, cbType) {
        var result = {
            page: 3,
            total: 7,
            records: 200,
            rows: [
                    {
                        id: 5,
                        firstname: "juri"
                    },
                    {
                        id: 6,
                        firstname: "juri123"
                    }
                 ]
        };
 
        return [result];
    };
 
    //act
    stop(500);
    var param = { currentPage: 0 };
    Test.PersonAccount.findAllPaged(param, 1, 10,
        function (data) {
            equals(param.currentPage, 0);
            start();
        },
        function (error) {
            ok(false, "Error: " + error.responseText);
            start();
        }
    );
});

Некоторое объяснение анатомии теста:

  • строка 1 — это заголовок контрольного примера, в котором указано имя теста в форме письменной строки, которая должна объяснить цель теста. «1» между фактической функцией теста и именем теста указывает количество ожидаемых подтверждений. Это полезно, поскольку JavaScript включает асинхронные действия и обратные вызовы. Поэтому мы хотим убедиться, что наш тест не пройден, если, например, не было вызвано никаких обратных вызовов.
  • строка 3 — эта строка определяет прибор, который заменяет фактический вызов ajax, который выполняется тестируемой функцией. Это встроенная функция, предоставляемая платформой JavaScriptMVC. Это можно сделать и вручную . Это важно, поскольку мы не хотим фактически связываться с сервером во время выполнения теста.
  • строка 24 — stop (timeout-миллисекунды) указывает тестовому случаю прекратить работу и продолжить выполнение только после повторного вызова start (). Узнайте больше здесь .
  • строка 26 — фактический вызов проверяемой функции.
  • строка 28 — утверждение

Запустите тест …

… это не удается.
Отлично.

Теперь иди и исправь ошибку


Чтобы исправить ошибку, я заменяю строку с ошибкой, как уже объяснялось в моем
предыдущем посте . По сути, замена
строки 6 функции findAllPaged следующим:

data: $.extend({}, params, { currentPage: currentPage, pageSize: pageSize }),

Перезапустите тест

Повторный запуск теста …
.. успех . Ошибка исправлена!

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

Это оно!