如何解决如何在不重定向的情况下测试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,但这仍然有些干扰...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。