1

$httpGET リクエストとハンドラーを返す角度サービスをテストしようとしていますthenが、関数内でロジックが実際に機能することをテストできませんthen。以下は、サービス コードの基本的な切り詰められたバージョンです。

angular.module('app').factory('User', function ($http) {
  var User = {};

  User.get = function(id) {
    return $http.get('/api/users/' + id).then(function (response) {
      var user = response.data;
      user.customProperty = true;  
      return user;
    });
  };

  return User;
});

そして、ここにテストがあります:

beforeEach(module('app'));
beforeEach(inject(function(_User_, _$q_, _$httpBackend_, _$rootScope_) {
  $q = _$q_;
  User = _User_;
  $httpBackend = _$httpBackend_;
  $scope = _$rootScope_.$new();
}));

afterEach(function () {
  $httpBackend.verifyNoOutstandingRequest();
  $httpBackend.verifyNoOutstandingExpectation();
});

describe('User factory', function () {

  it('gets a user and updates customProperty', function () {
    $httpBackend.expectGET('/api/users/123').respond({ id: 123 });
    User.get(123).then(function (user) {
      expect(user.customProperty).toBe(true);  // this never runs
    });

    $httpBackend.flush();
  });

});

呼び出しのロジックをテストするためにほとんどすべてを試したような気がするthenので、誰かが提案を提供できる場合は、大いに感謝します.

編集:私の問題は非標準の注入慣行によるものでもあったため、以下の回答はそれ以外で機能しました。

4

1 に答える 1

4

いくつか変更する必要があります

  • 応答を偽造するためにwhenGET代わりに使用しますexpectGET
  • テストthenコールバックで、コールバックの外部で使用可能な変数への応答を設定して、expect呼び出しでテストできるようにします。
  • expect呼び出しがコールバックの外側にあることを確認してください。これにより、常に実行され、失敗が表示されます。

すべてを一緒に入れて:

it('gets a user and updates customProperty', function () {
  $httpBackend.whenGET('/api/users/123').respond({ id: 123 });
  User.get(123).then(function(response) {
    user = response;
  })
  $httpBackend.flush();
  expect(user.customProperty).toBe(true); 
});

http://plnkr.co/edit/9zON7ALKnrKpcOVrBupQ?p=previewで見られるように

于 2014-08-04T20:30:01.053 に答える