Тестирование перенаправления всей страницы в qUnit - PullRequest
7 голосов
/ 30 августа 2011

У меня есть следующая функция

var redirect = function() {
    window.location.href = "http://www.google.com";
}

Я хочу протестировать эту функцию с помощью qUnit.

Проблема заключается в том, что при вызове документа HTML, в котором выполняются мои тесты,как только он добирается до теста, который вызывает redirect(), браузер загружает google.com.То, что я хотел бы сделать, это каким-то образом смоделировать window.location.href, чтобы он не перенаправлялся, и чтобы я мог проверить, что для него установлено правильное значение.

Переписать это так, чтобы онобудет более проверяемым, будет приемлемым ответом и приветствуется.Поскольку я использую qUnit, подойдет некоторая магия jQuery, как и какой-то старомодный рефакторинг.Было предложено добавить пользовательский установщик для window.location.href, но я не мог понять, как заставить это работать.

Пожалуйста, не предлагайте изменить поведение моего кода.

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Вот как я решил это. giggity.navOnChange - это функция, аналогичная redirect в исходном вопросе.

Код:

var giggity = giggity || {};

$(document).ready(function() {
    $("#branches").change(giggity.navOnChange);
    $("#tags").change(giggity.navOnChange);
});

giggity.window = window;

giggity.navOnChange = function() {
    giggity.window.location.href = this.value;
};

Тестовый код:

var giggity = giggity || {};

test("giggity.navOnChange", function() {
    var temp = giggity.window
    giggity.window = { location: {} };
    var mockSelect = {
        value: "/link/to/some/branch",
        onChange: giggity.navOnChange
    }
    mockSelect.onChange();
    equal(giggity.window.location.href, mockSelect.value);
    giggity.window = temp; // restore mocked variable
});

Я использую объект giggity в качестве пространства имен для моего кода. Я назначаю переменную giggity.window для указания на window и взаимодействую с window через giggity.window. Таким образом, я легко могу высмеивать любые манипуляции с объектом window. Я указываю giggity.window на фиктивный объект, вызываю функцию, которая модифицирует giggity.window, и проверяю значение макета.

2 голосов
/ 20 октября 2011

Вы не можете изменить window.location.href без перезагрузки страницы. Но если вы абсолютно хотите протестировать такого рода функции, это требует небольшой логической модификации.

Пример № 1:

Вы можете сделать это с двумя функциями, одна может быть простой функцией redirectTo, аналогичной вашей, а другая может быть той, которая имеет логику построения и URL. Как это:

// this function is so simple that you never need to unit test it
var redirectTo = function(url)
{
    window.location.href = url;
}

// if this function has any logic worth testing you can do that without redirects
var buildUrl = function(someParameters)
{
    // ....
    // here be some logic...
    // ....

    return "http://www.google.com";
}
  1. Функция redirectTo (url) настолько проста, что вы всегда будете знать, что она работает без тестирования.
  2. Функция buildUrl (someParameters) может содержать логику для построения URL, и вы должны проверить это. И вы можете проверить это без перенаправления страницы.

Пример № 2:

Вы также можете написать нечто среднее:

// don't test this function as it will redirect
var redirect = function()
{
    window.location.href = buildUrl();
}

// if this function has any logic worth testing you can do that without redirects
var buildUrl = function()
{
    // ....
    // here be some logic...
    // ....

    return "http://www.google.com";
}

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

Не пример, а № 3:

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

1 голос
/ 12 апреля 2014

То, что вы хотите сделать, лучше всего делать на уровне интеграционных или приемочных испытаний, а не на уровне модульных испытаний.В противном случае вы получите поддельные браузеры, а затем не тестируете реальный мир и ничего не тестируете.

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

Однако, похоже, qUnit не имеет всех инструментов, которые вам понадобятся для этого, поэтому, если вы хотите протестировать несколько вещей, требующих страницыперезагрузите / навигацию, вам следует использовать другой инструмент тестирования.

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

...