gpt4 book ai didi

angularjs - Mocha/angular 单元测试从不运行 'then' 函数

转载 作者:行者123 更新时间:2023-12-04 02:22:50 25 4
gpt4 key购买 nike

我正在尝试测试一个在 mocha chai 中返回 promise 的 angular.service ,但在单元测试中调用“then”超时。我的服务依赖于带有异步 $resource 请求的第二个服务。 myService.getData() 应该在内部从所述异步服务获取数据并将 promise 传递给 Controller ​​, Controller 在响应中调用“then”函数。这在 Controller 中运行良好,但在单元测试中绝对失败。

服务代码:

// 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);
});

最佳答案

angular 中的 promise 解析是在摘要循环中进行的,您可以通过在测试中调用 scope.$apply(); 来触发此循环。

您可以阅读更多here .

关于angularjs - Mocha/angular 单元测试从不运行 'then' 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com