Как проверить перенаправление JavaScript без перенаправления? - PullRequest
14 голосов
/ 27 мая 2011

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

У меня есть функция, которая при определенных условиях перенаправляет пользователя на другую страницу, используя window.location.assign. Проблема в том, что если эта строка достигнута, страница перенаправляется. В этом случае, поскольку он перенаправляется на '/', страница перезагружается, и все тесты запускаются снова. Что я могу сделать, чтобы проверить, что функция достигает линии, где она перенаправляет, без перенаправления ?

Ответы [ 4 ]

19 голосов
/ 27 мая 2011

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

function redirect() {
 if(something) {
  window.location = "/";
 else if(somethingElse)
  window.location = "/?a=42";
 else
  window.location = "/derp";
}

Я бы изменил это на ..

function redirect() {
 if(something) {
  doRedirect("/");
 else if(somethingElse)
  doRedirect("/?a=42");
 else
  doRedirect("/derp");
}

function doRedirect(href) {
 window.location = href;
}

Тогда вы можете spyOn функция doRedirect, чтобы обеспечить функцию перенаправленияпередает правильный URI для условий.

1 голос
/ 09 ноября 2012

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

var unit = {
  initialize: function () {
    this.window = window;
  },
  codeThatRedirects: function (newUrl) {
    this.window.location.href = newUrl;
  }
};

Теперь вы можете заменить unit.window чем-то другим, возможно, вот так:

unit.initialize();
unit.window = {
  location: {
    href: "dummy"
  }
};

unit.codeThatRedirects('http://new.url.com');

assert(unit.window.location.href === "http://new.url.com");
1 голос
/ 23 марта 2012

Вот полный пример тестирования, при котором нажатие кнопки покупки перенаправляет пользователя на внешний URL-адрес, используя упомянутый метод @Morgan.

# navigation.coffee
exports.goToExternalUrl = (url) ->
    window.location = url


# myView.coffee
Navigation = require("lib/navigation")

exports.MyView = Backbone.View.extend
  events:
    "click .purchase":"purchase"

  purchase: ->
    Navigation.goToExternalUrl("http://amazon.com/someproduct")


# my_view_spec.coffee
Navigation = require("lib/navigation")
MyView = require("myView").MyView

describe("MyView"), ->
  it "can be purchased", ->
    # this line prevents the location.href from actually being set
    spyOn(Navigation,'goToExternalUrl').andCallFake (->)

    $el.find('.purchase').trigger('click')
    expect(Navigation.goToExternalUrl).toHaveBeenCalled()
0 голосов
/ 27 мая 2011

Вы можете рассмотреть возможность использования GreaseMonkey для обновления javascript, но это остается несколько навязчивым ...

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