我想我错过了什么。花了一些时间试图理解为什么我的测试不起作用。
代码。
angular.module('services')
.factory('UserPreferencesService', ['$resource', function ($resource)
{
return $resource('/rest/user-preferences/:id', {},
{ getById: { method: "GET", params: { id:'@id'}} });
}
]);
测试:
it('should get by Id', function() {
//given
var preferences = {language: "en"};
httpBackend.whenGET('/rest/user-preferences/1').respond(preferences);
//when
service.getById( {id:1} ).$promise.then(function(result) {
console.log("successssssssssssssssssssssssssssssssssssss");
//then
expect(result).toEqual(preferences);
}, function() {
console.log("something wrong");
})
});
它永远不会触发:“successsssssssssssssssssssssssssssssssssss”。
我错过了什么?
最佳答案
您的代码中存在一些错误和其他缺失。
主要问题是您没有调用模拟服务器响应的 flush()
函数,因此 $promise
从未得到解决。另外,请记住,当 promise 得到解决时,您得到的响应就是一个 promise ,这意味着: expect(result).toEqual(preferences);
将不起作用,但是: expect(result.lang).toEqual(preferences.lang);
会。
这里有一个固定版本的代码:
服务:
angular.module('services',['ngResource'])
.factory('UserPreferencesService', ['$resource', function ($resource)
{
return $resource('/rest/user-preferences/:id', {},
{ getById: { method: "GET", params: { id:'@id'}} });
}
]);
测试:
describe('My Suite', function () {
var httpBackend, service;
beforeEach(module('services'));
beforeEach(inject(function (_$httpBackend_, UserPreferencesService) {
httpBackend = _$httpBackend_;
service = UserPreferencesService;
}));
describe('My Test', function () {
it('should get by Id', function() {
var preferences = {language: "en"};
var result = {};
httpBackend.whenGET('/rest/user-preferences/1').respond(preferences);
service.getById({id:1}).$promise.then(function(result_) {
result = result_;
});
expect(result.language).not.toEqual(preferences.language);
httpBackend.flush();
expect(result.language).toEqual(preferences.language);
});
});
});
Working Example
关于angularjs - $httpBackend 测试 $resource 服务的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26425429/