我想我想念一些东西。花了一些时间试图理解为什么我的测试不起作用。
代码。
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");
})
});
它永远不会触发:" successssssssssssssssssssssssssssssssssssssssss"
我错过了什么?
答案 0 :(得分:4)
您的代码中存在一些错误和其他缺失的内容。
主要问题是您没有调用模拟服务器响应的flush()
函数,因此$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);
});
});
});
答案 1 :(得分:0)
我想补充一点,我遇到了同样的问题,但是正在使用回调,如下所示:
httpBackend.whenGET('/rest/user-preferences/1').respond(function(method, url, data) {
//do something with method, url, data...
return 200;
});
直到我将return 200
替换为return [200]
之后,它才被击中。显然,它需要一个数组才能返回。
我认为此信息可以更明确地显示here。