我正在尝试测试一些客户端代码,为此我需要使用Mocha / Sinon来存储window.location.href
属性的值。
到目前为止我尝试了什么(using this example):
describe('Logger', () => {
it('should compose a Log', () => {
var stub = sinon.stub(window.location, 'href', 'http://www.foo.com');
});
});
跑步者显示以下错误:
TypeError:自定义存根应该是函数或属性描述符
将测试代码更改为:
describe('Logger', () => {
it('should compose a Log', () => {
var stub = sinon.stub(window.location, 'href', {
value: 'foo'
});
});
});
产生此错误:
TypeError:尝试将字符串属性href包装为函数
将函数作为第三个参数传递给sinon.stub
也不起作用。
有没有办法提供假window.location.href
字符串,也避免重定向(因为我在浏览器中测试)?
答案 0 :(得分:16)
您需要使用global
在window
或beforeEach
it
对象
e.g。
it('should compose a Log', () => {
global.window = {
location: {
href: {
value: 'foo'
}
}
}
//.... call the funciton
});
答案 1 :(得分:12)
使用window.location.assign(url)
而不是覆盖window.location
的值。然后,您可以在assign
对象上存根window.location
方法。
http://www.w3schools.com/jsref/met_loc_assign.asp
更新:我在无头浏览器中对此进行了测试,但如果您在Chrome中运行测试,它可能无效。请参阅@try-catch-finally's response。
答案 2 :(得分:7)
Stubs不能替换属性,只能替换函数。
抛出的错误强化了这一点:
TypeError:自定义存根应该是函数或属性描述符
来自文档:
何时使用存根?
根据需要使用存根:
从测试中控制方法的行为,以强制代码沿特定路径下移。示例包括强制方法抛出错误以测试错误处理。
- 醇>
当您想要阻止直接调用特定方法时(可能是因为它触发了不需要的行为,例如XMLHttpRequest或类似行为)。
http://sinonjs.org/releases/v2.0.0/stubs/
虽然可以替换许多内置对象(用于测试),但有些内容可能无法实现。对于这些属性,您可以创建外观对象,然后必须在代码中使用它们,并且能够在测试中替换它们。
例如:
var loc = {
setLocationHref: function(newHref) {
window.location.href = newHref;
},
getLocationHref: function() {
return window.location.href;
}
};
用法:
loc.setLocationHref('http://acme.com');
然后你可以在你的测试中写
var stub = sinon.stub(loc, 'setLocationHref').returns('http://www.foo.com');
请注意链式returns()
电话。您的代码中还有另一个错误:第三个参数必须是函数,而不是另一个类型的值。它是一个回调,而不是该属性应返回的内容。