我的承诺无法在我的测试中解决。我有两项服务。
1- ServerApiService ,通常会调用服务器:
angular.module('test').service('serverApiService', ['$http', function($http) {
var self = this;
self.generateRequest = function(actionName, data) {
console.log('request generated');
//normally returns 'return $http(config);'
};
}]);
2-第二项服务使用ServerApiService,并管理解决方案 SolutionService :
angular.module('test').service('solutionService', ['$q', 'serverApiService', function($q, serverApiService) {
var self = this;
self.list = function(account) {
var data = {
id: account.id
};
var deferred = $q.defer();
serverApiService.generateRequest('solutions.list', data).then(function(response) {
var solutions = [];
for(var i = 0; i < response.Items.length; i++) {
var solutionJSON = response.Items[i];
var studyJSON = solutionJSON.Study;
var solution = {};
solution.id = solutionJSON.Id;
var study = {};
study.name = studyJSON.Name;
solution.study = study;
solutions.push(solution);
}
deferred.resolve(solutions);
});
return deferred.promise;
};
}]);
测试问题
我想测试SolutionService模块,所以我创建了一个ServerApiService的模拟,但我无法让spy函数返回promise,我不知道为什么:
describe('solution service', function () {
var mockServerApiService, solutionSvc;
beforeEach(function() {
module('test');
});
beforeEach(function() {
module(function($provide) {
$provide.service('serverApiService', function($q) {
this.generateRequest = jasmine.createSpy('generateRequest').and.callFake(function(actionName, data) {
var deferred = $q.defer();
deferred.resolve({Items: [
{
Id: '910759',
Study: {
Id: '213123',
Name: 'test'
},
},
{
Id: '4406510',
Study: {
Id: '063294',
Name: 'test2'
},
},
]});
return deferred.promise;
});
});
});
});
beforeEach(inject(function (serverApiService, solutionService) {
mockServerApiService = serverApiService;
solutionSvc = solutionService;
}));
it('should return all the solutions', function(done) {
var account = {};
account.id = 'test@test.com';
solutionSvc.list(account).then(function(solutions) {
expect(solutions.length).toBe(2);
done();
});
expect(mockServerApiService.generateRequest).toHaveBeenCalled();
})
});
基本上,从不调用SolutionService中的then部分:
serverApiService.generateRequest('solutions.list', data).then(function(response) {
//Never called
});
以下是情况的一部分:http://plnkr.co/edit/gMyaOpfczBmt9HhwzI9m?p=preview
答案 0 :(得分:5)
您需要启动角度摘要才能解决承诺。我通过注入一个新的示波器并在测试中调用apply来解决你的问题。见这里:http://plnkr.co/edit/Nrlg7KwfwTNJW3gpAG1m
var mockServerApiService, solutionSvc, scope;
beforeEach(function() {
module('test');
});
beforeEach(function() {
module(function($provide) {
$provide.service('serverApiService', function($q) {
this.generateRequest = jasmine.createSpy('generateRequest').and.callFake(function(actionName, data) {
var deferred = $q.defer();
deferred.resolve({Items: [
{
Id: '910759',
Study: {
Id: '213123',
Name: 'test'
},
},
{
Id: '4406510',
Study: {
Id: '063294',
Name: 'test2'
},
},
]});
return deferred.promise;
});
});
});
});
beforeEach(inject(function (serverApiService, solutionService, $rootScope) {
mockServerApiService = serverApiService;
solutionSvc = solutionService;
scope = $rootScope.$new();
}));