比方说,我有一个效用函数,为了简单起见(真实的东西是复杂的和不相关的),返回当前窗口的查询字符串。是否可以模拟qUnit测试的window.location对象?
var someUtilityFunction =() {
return window.location.search.substring(1);
};
现在我想单元测试qUnit这个功能(不知道,如果测试工具是相关与否):
test('#1 someUtilityFunction works', function() {
// setup
var oldQS = window.location.search;
window.location.search = '?key1=value1&key2=value2&key3=value3';
var expectedOutput = 'key1=value1&key2=value2&key3=value3';
// test
equals(someUtilityFunction(),
expectedOutput,
'someUtilityFunction works as expected.');
// teardown
window.location.search = oldQS;
});
这里的问题是,window.location.search
设置为不同的查询字符串是导致页面重新加载,本质上进入无限的请求循环。有没有办法模拟出window.location对象没有对someUtilityFunction
函数做任何修改?
感谢您的回答。重写代码不会有帮助,因为它可以选择使用'window'对象 - 这种情况在测试什么时候没有通过。将函数包装在“模拟块”中会改变函数中的代码,这看起来像我可能不得不做的。 – jbabey 2012-08-10 13:42:48
你以某种方式需要包装你的代码,以避免重写你的代码。我只是尝试了一个“包装”,它的效果也很好(不过它使用它的感觉不对)。然后,您可以使全局可用的自定义'窗口'对象模拟您的属性,并使其在代码中以及测试中可用。我想这就是jQuery和Zepto的做法,因为他们也将'window'和'document'传递给它们的包装器。 – 2012-08-10 20:09:14