在qUnit中测试整页重定向

我有以下function

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

我想用qUnit测试这个函数。

问题是,当我调用运行测试的HTML文档时,只要它进入调用redirect()的测试,浏览器就会加载google.com。 我想做的是以某种方式模拟window.location.href,以便它不重定向,所以我可以检查它是否设置为正确的值。

以一种更可测试的方式重写它将是一个可接受的答案,并受到欢迎。 由于我使用的是qUnit,因此一些jQuery魔法是合适的,就像一些老式的重构一样。 建议为window.location.href添加自定义setter,但我无法弄清楚如何使其工作。

请不要改变我的代码行为的建议。

这是我最终解决它的方式。 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 ,并通过giggity.windowwindow进行giggity.window 。 这样,我可以轻松地模拟window对象的任何操作。 我将giggity.window指向一个模拟对象,调用修改giggity.window的函数并检查mock的值。

您无法在不重新加载页面的情况下修改window.location.href。 但如果您绝对想要测试这些function,则需要进行一些逻辑修改。

示例#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"; } 

上面的示例将具有与原始函数类似的forms,但具有您可以实际测试的URL构建逻辑函数。

不是一个例子,但#3:

另一方面,如果你不想改变你的逻辑并且你有一个简单的function,那么如果你不测试它就没什么大不了的…

您希望做的最好是在集成或验收测试级别,而不是unit testing级别。 否则你最终会使用假浏览器,然后你就不会测试真实世界,也不会真正测试任何东西。

您可以在与测试相同的域上打开和iframe,并在其中加载代码。 然后,您将能够使用异步测试进行断言。

但是qUnit似乎并没有真正需要的所有工具,所以如果你想要测试更多需要页面重新加载/导航的东西,你应该使用不同的测试工具。

其他海报提到的另一种方法是模拟位置对象并测试代码的行为(而不是浏览器)。