2

Mocha テストで、sinon を使用して angular の $http の簡単なモックを作成しようとしています。

しかし、私のスパイは、私が何をしようとしても結果を出しません。

searchResource.typeAhead は、テスト中の私の関数です。引数に基づいて $http を呼び出します。リクエストが正しいことを確認したいと思います。

searchResource.typeAhead は promise を返しますが、チェック コードを .then() に入れてみましたが、実行されません。

suite('Search Resource', function() {

  var injector = angular.injector(['cannonball-client-search', 'cannonball-client-core']);
  var searchResource = injector.get('SearchResource');

  suite('#typeAhead()', function () {
    setup(function () {
      this.server = sinon.fakeServer.create();
      this.server.respondWith('GET',
        config.endpoints.search.typeAhead,
        [200, {'Content-Type': 'application/json'}, '[{ "id": 12, "comment": "Hey there" }]']);
      this.spyhttp = sinon.spy(injector.get('$http'));
    });
    teardown(function () {
      this.server.restore();
    });
    test('positive', function (done) {
      searchResource.typeAhead(
        'expl',
        [{entityType: 'itementity'}],
        [{createdBy: 'Eric'}, {createdBy: 'Tal'}],
        10
      );
      this.server.respond();
      expect(this.spyhttp.calledWith({
        method: 'get',
        url: config.endpoints.search.typeAhead +
        '?query=expl&filter=entityType:itementity&orfilter=createdBy:Eric&orfilter=createdBy:Tal&limit=10'
      })).to.be.true();
      done();
    });
  });
});
4

2 に答える 2

3

Angular はテストを念頭に置いて構築されました。以前のコメントは、sinon を使用して $http をモックアウトできないことを示唆しているわけではありません。これは一般的な方法ではなく、$httpBackend の場合ほど簡単には実行できません。

個人的には、Angular に属さない依存関係をモックするためにのみ sinon を使用します。$httpBackend を使用してモック応答を提供するのは簡単です。

$httpBackend.when('GET', '/url').respond({
    mock: 'response'
});

これで、「/url」へのすべてのリクエストでモック レスポンス オブジェクトが使用されます。$httpBackend には、おそらくインターセプターなどの他のものを処理するために、他の複雑な魔法が組み込まれていると思いますか?

于 2016-03-20T03:26:07.903 に答える