如何在不重定向的情况下测试javascript重定向?

| 我正在使用Jasmine进行一些测试,尽管通常可以将其应用于基于浏览器的javascript单元测试。 我有一个函数,可以在某些情况下使用
window.location.assign
将用户重定向到其他页面。问题是,如果到达此行,页面将被重定向。在这种情况下,由于将其重定向到
\'/\'
,因此页面将重新加载,并且所有测试将再次运行。我应该怎么做才能测试该功能是否到达了重定向的行,而没有重定向?     
已邀请:
        我也遇到过同样的问题。我的解决方案是将实际重定向分解为一个单一目的的功能。也就是说,不执行任何条件检查或其他逻辑,只需重定向即可。 说这是旧的代码...
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;
}
然后,您可以对功能进行“ 4”或“ 5”功能,以确保重定向功能针对该条件传递正确的URI。     
        这是一个完整的示例,用于测试单击购买按钮使用提到的@Morgan方法将用户重定向到外部URL。
# 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()
    
        这里的困难是您的代码依赖于全局变量
window
,因此您无法轻松地在测试中替换该依赖项。这是我在类似情况下所做的基本想法。编写您的代码,以使“ 7”仅能间接访问,除非在初始化期间将其保存到本地/实例变量中。
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\");
    
        您可能会考虑使用GreaseMonkey更新javascript,但这仍然有些干扰...     

要回复问题请先登录注册