我有一个服务工厂
,用于连接数据的api
并与之交互。这是服务:
angular.module('dbRequest', [])
.factory('Request', ['$http', 'localConfig', function($http, localConfig){
return {
getDataRevision: function(){
return $http({
url: localConfig.dbDataUrl,
method: "GET",
crossDomain: true,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}
}
}]);
从 this answer 获取线索, 这是我正在测试的方法:
describe('Service: Request', function () {
var $scope, srvMock, $q, lc, $httpBackend;
beforeEach(module('webApp'));
beforeEach(inject(function($rootScope, Request, _$q_, _$httpBackend_, localConfig){
$scope = $rootScope.$new();
srvMock = Request;
$q = _$q_;
$httpBackend = _$httpBackend_;
lc = localConfig;
$httpBackend.expect('GET', lc.dbDataUrl);
$httpBackend.when('GET', lc.dbDataUrl).respond({
success: ["d1","d2", "d3"]
});
}));
it('should return a promise', function(){
expect(srvMock.getDataRevision().then).toBeDefined();
});
it('should resolve with data', function(){
var data;
var deferred = $q.defer();
var promise = deferred.promise;
promise.then(function(res){
data = res.success;
});
srvMock.getDataRevision().then(function(res){
deferred.resolve(res);
});
$scope.$digest();
expect(data).toEqual(["d1","d2", "d3"]);
})
});
should return a promise
通过,但下一个 should resolve with data
失败并出现此错误:
Expected undefined to equal [ 'd1', 'd2', 'd3' ].
但是,service
方法 getDataRevision
被调用,但没有被测试中的模拟 promise 解析。如何进行更正?
最佳答案
目前您期望模拟数据存在于 data
中无需冲洗的变量 httpRequest
s,但这不会发生,直到你 flush
所有httpRequest
秒。什么$httpBackend.flush()
确实是,它将模拟数据返回给您使用 $httpBackend.when('GET', lc.dbDataUrl).respond
所做的特定请求.
此外,您不需要创建额外的 promise ,这将是一项开销。您可以使用服务函数返回 promise 本身,而不是自定义 promise ,如下所示。
代码
it('should resolve with data', function(){
var data;
srvMock.getDataRevision().then(function(res){
data = res.success;
});
$scope.$digest();
$httpBackend.flush(); //making sure mocked response has been return
//after .then evaluation only below code will get called.
expect(data).toEqual(["d1","d2", "d3"]);
})
关于javascript - 服务 promise 不解决 karma ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894652/