AngularJS:测试返回$ http promises的工厂

时间:2014-08-04 19:48:17

标签: angularjs unit-testing jasmine karma-jasmine angular-promise

尝试测试返回$http GET请求和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电话中的逻辑,所以如果有人可以提供建议我会非常感激。

编辑:我的问题也是由于非标准的注射操作,所以下面的答案在那之外工作。

1 个答案:

答案 0 :(得分: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

看到