我有以下功能
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是类似于原始问题中的重定向的函数.
码:
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变量指定为指向窗口,并通过giggity.window与窗口进行交互.这样,我可以轻松地模拟窗口对象的任何操作.我将giggity.window指向一个模拟对象,调用修改giggity.window的函数并检查mock的值.