尝试测试返回$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
电话中的逻辑,所以如果有人可以提供建议我会非常感激。
编辑:我的问题也是由于非标准的注射操作,所以下面的答案在那之外工作。
答案 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);
});
看到