Javascript Jasmine测试:监视对函数的第一次调用
我正在编写一个测试,强制执行一个异常,然后在catch块中调用相同的函数 在我的测试中,我需要监视localStorage.setItem一次,这是我模拟异常的地方。当调用方再次被调用时,我需要移除间谍或者以某种方式防止catch块再次被击中Javascript Jasmine测试:监视对函数的第一次调用,javascript,jasmine,Javascript,Jasmine,我正在编写一个测试,强制执行一个异常,然后在catch块中调用相同的函数 在我的测试中,我需要监视localStorage.setItem一次,这是我模拟异常的地方。当调用方再次被调用时,我需要移除间谍或者以某种方式防止catch块再次被击中 it('handles quota_exceeded exceptions', function() { spyOn(localStorage, 'setItem').andCallFake(function() { throw new
it('handles quota_exceeded exceptions', function() {
spyOn(localStorage, 'setItem').andCallFake(function() {
throw new Error("QUOTA_EXCEEDED_ERR", "QUOTA_EXCEEDED_ERR: DOM Exception 22");
});
spyOn(Obj, 'add').andCallThrough();
spyOn(Obj, 'clean');
expect(function() {
Obj.add('foo', 'bar');
}).not.toThrow();
expect(Garage.add.callCount).toBe(2);
});
上面的测试代码生成一个无限循环,因为localStorage.setItem每次都会引发一个异常
任何想法或替代测试模式将不胜感激
谢谢您可以将本地存储配额状态存储在本地变量中。比如:
it('handles quota_exceeded exceptions', function() {
var quota_exceeded = true;
spyOn(localStorage, 'setItem').andCallFake(function() {
if (quota_exceeded) {
throw new Error("QUOTA_EXCEEDED_ERR", "QUOTA_EXCEEDED_ERR: DOM Exception 22");
}
});
spyOn(Obj, 'add').andCallThrough();
spyOn(Obj, 'clean').andCallFake(function () {
quota_exceeded = false;
});
expect(function() {
Obj.add('foo', 'bar');
}).not.toThrow();
expect(Garage.add.callCount).toBe(2);
});
您可以将本地存储配额状态存储在本地变量中。比如:
it('handles quota_exceeded exceptions', function() {
var quota_exceeded = true;
spyOn(localStorage, 'setItem').andCallFake(function() {
if (quota_exceeded) {
throw new Error("QUOTA_EXCEEDED_ERR", "QUOTA_EXCEEDED_ERR: DOM Exception 22");
}
});
spyOn(Obj, 'add').andCallThrough();
spyOn(Obj, 'clean').andCallFake(function () {
quota_exceeded = false;
});
expect(function() {
Obj.add('foo', 'bar');
}).not.toThrow();
expect(Garage.add.callCount).toBe(2);
});
谢谢你的简单解决方案。不知道为什么我在做这件事的时候得到了隧道视觉。谢谢你的简单解决方案。我不知道为什么我在做这件事的时候会有幻觉。