0

我正在编写一个强制异常的测试,然后在 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 每次都会引发异常。

任何想法或替代测试模式将不胜感激。

谢谢

4

1 回答 1

4

您可以将 localStorage 配额状态存储在本地变量中。就像是:

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);
});
于 2012-12-18T21:05:31.197 回答