【问题标题】:Mock window.location.reload in Jasmine testing在 Jasmine 测试中模拟 window.location.reload
【发布时间】:2014-12-04 23:33:25
【问题描述】:
我在我的 javascript 中创建了一个 window.location.reload 函数。
我需要在 Jasmine 中测试时模拟 reload 函数,因为它一直在循环。
当我运行grunt jenkins 时测试很顺利。但不是在浏览器中进行测试时(mozilla/chrome)。
这是我的代码 sn-p。
Javascript:
window.location.reload();
茉莉花测试:
spyOn(window.location, 'reload').and.callFake(function(){});
谁能帮我解决这个问题?
【问题讨论】:
标签:
mocking
jasmine
window.location
【解决方案1】:
您应该始终使用$window 而不是window。
试试这个:
$window = jasmine.createSpy('$window');
或者自己制作:
$window = {location:{reload:function(){}}};
【解决方案2】:
感谢您分享您的观点。
我按照建议进行了解决,并且成功了。
由于 window 是一个浏览器对象并且无法被窥探,我只是将函数包装在 JavaScript 中并在我的测试规范中引用了该函数。
Javascript 代码:
var function = windowReload(){
window.location.reload();
}
在需要的地方调用函数windowReload()。
茉莉花测试:
spyOn(obj, 'windowReload').andCallFake(function(){});
【解决方案3】:
你总是可以这样做的:
beforeAll(() => {
window.reload = () => console.log('Mock redirect');
});
分别:
beforeAll(() => {
window.onbeforeunload = () => console.log('Mock redirect');
window.open = () => console.log('Mock redirect');
});
【解决方案4】:
这对我在与 Jamine 的 BeforeEach 中很有效
delete window.location;
window.location = Object.create(window);
window.location.reload = () => {};
spyOn(window.location, 'reload');
这使用 Jest 有效
delete window.location;
window.location = Object.create(window);
window.location.reload = jest.fn();
【解决方案5】:
我刚遇到同样的问题。 window.location = '' 在浏览器中运行时导致 inf 循环。
一个简单的解决方案是设置 window.location = '#' 来停止重新加载。