0

例外を強制するテストを作成してから、catch ブロックで同じ関数を呼び出します。

私のテストでは、localStorage.setItem を 1 回スパイする必要があります。これは、例外をシミュレートする場所です。発信者が再び呼び出されたら、スパイを削除するか、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 に答える