我正在尝试测试可在摩卡咖啡中返回promise的角度服务,但是在单元测试中调用“ then”会超时。我的服务依赖于带有异步$ resource请求的第二个服务。myService.getData()应该从内部从所述异步服务获取数据,并将承诺传递给控制器,该控制器在响应上调用“ then”函数。这在控制器中效果很好,并且在单元测试中绝对失败。
服务代码:
// use: myService.getData.then(...) works beautifully in angular controllers
getData = function(dataId) {
var dataPromise;
// get students from the api, if necessary, or from the service if already retrieved
// dataList is a private property of the service
if(!dataList) {
dataPromise = asyncServiceUsedByMyService.asyncMethod({...}).$promise
.then(
function(response){
dataList = response;
doSomeDataManipulation();
return dataList;
},
function(err) {
return err;
}
);
}
// use the existing studentList if available
else {
dataPromise = $q.when(function(){
return dataList
});
}
return dataPromise;
};
测试代码
describe('Service Test', function() {
var expect = chai.expect,
myService,
asyncServiceUsedByMyService;
beforeEach(function() {
var data,
asyncServiceMock;
data =[...];
// mock the async dependency
asyncServiceMock = {
asynchMethod: function () {
var deferred = q.defer();
deferred.resolve(data);
return {$promise: deferred.promise};
}
};
module('myApp');
module(function($provide){
$provide.value('asyncServiceUsedByMyService', asyncServiceMock);
});
inject(function(myService, $q, asyncServiceUsedByMyService) {
myService = myService;
q = $q;
courseEnrollmentService = courseEnrollmentServiceMock;
});
});
// passes
it('should be available', function() {
expect(!!myService).to.equal(true);
});
// 'then' function is never called, unit test times out
it('should get all items from async dependency', function(done) {
myService.getData().then(function(response) {
expect(response).to.have.property('length').that.equals(5);
done();
});
});
});
我如何获取myService的“ then”功能以在单元测试中运行,因此它将获取模拟的数据(由于我们没有进行实际的api调用,该数据应该几乎是瞬时的?)。
注意:我也尝试了'chai-as-promised'语法,但是以下内容似乎超时了
it('should get all items from async dependency', function(done) {
expect(myService.getData()).to.eventually.have.property('length').that.equals(5).and.notify(done);
});
角度承诺的分辨率是在摘要周期中确定的,您可以通过调用scope.$apply();
测试来触发此周期。
您可以在这里阅读更多内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句