Javascript Jasmine测试:监视对函数的第一次调用

Javascript Jasmine测试:监视对函数的第一次调用,javascript,jasmine,Javascript,Jasmine,我正在编写一个测试,强制执行一个异常,然后在catch块中调用相同的函数 在我的测试中,我需要监视localStorage.setItem一次,这是我模拟异常的地方。当调用方再次被调用时,我需要移除间谍或者以某种方式防止catch块再次被击中 it('handles quota_exceeded exceptions', function() { spyOn(localStorage, 'setItem').andCallFake(function() { throw new

我正在编写一个测试,强制执行一个异常,然后在catch块中调用相同的函数

在我的测试中,我需要监视localStorage.setItem一次,这是我模拟异常的地方。当调用方再次被调用时,我需要移除间谍或者以某种方式防止catch块再次被击中

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);
});

谢谢你的简单解决方案。不知道为什么我在做这件事的时候得到了隧道视觉。谢谢你的简单解决方案。我不知道为什么我在做这件事的时候会有幻觉。