6

条件が満たされるまでリソースをポーリングするシーケンスをテストしています。

Book = $resource("/books/:id", {id: "@id"});

function poll(success) {
  Book.get({id:1}, function() {
    if (canStop) {
       success();
    } else {
       $timeout(poll, 1000);
    }

  });
};

以下のテストは失敗しますError: Unsatisfied requests: GET /user_workshops/1

describe('poll', function() {
  beforeEach(function() {
    $httpBackend.expectGET('/books/1').respond(200,{id:1});
    $httpBackend.expectGET('/books/1').respond(200,{id:1, newVal:1});

    poll(function() {
       successCalled = true;
    });

    $httpBackend.flush();
    $timeout.flush();

    canStop=true;

    $httpBackend.flush();
  });

  it('should call success when canStop is true', function() {
     expect(successCalled).toBe(true);
  });
});

テスト順序を並べ替えて、2 番目を 2 番目のexpectGET直前に配置しようとしましたhttpBackend.flush()が、次のようになります。

Error: Unexpected request: POST /books/1
No more request expected
4

2 に答える 2

11

1時間の髪の毛の引っ張りの後、httpBackendは呼び出されたものをテストする順序について非常に具体的であることに気付きました.flushを呼び出す直前ではなく、リソース要求が行われる前に期待値を設定する必要があり、flushを呼び出すときは期待された要求だけを正確に行いました。

これは、連続したリクエスト間でフラッシュしたい場合、リクエストと期待の順序が正確でなければならないことを意味します:

$httpBackend.expectGET('...')
resource.get();
$httpBackend.flush()
$httpBackend.expectGET('...')
resource.get();
$httpBackend.flush()
...
etc

したがって、上記のコードの場合、順序を次のように変更すると機能します。

describe('poll', function() {
  beforeEach(function() {
    $httpBackend.expectGET('/books/1').respond(200,{id:1});

    poll(function() {
       successCalled = true;
    });

    $httpBackend.flush();

    $httpBackend.expectGET('/books/1').respond(200,{id:1, newVal:1});

    $timeout.flush();
    canStop=true;

    $httpBackend.flush();
  });

  it('should call success when canStop is true', function() {
     expect(successCalled).toBe(true);
  });
});
于 2015-07-28T06:16:11.567 に答える