我正在使用Karma来测试我的MEAN应用程序,并且很难从AngularJS(ng-mock)中的$ httpBackend'pectingPOST'方法返回一个空数组。
以下是我正在测试的服务方法:
this.getIds = function(path, callback) {
// console.log('Sending request to get IDs to the path: ' + path);
$http.post('/dropbox/getIds', {path: path} ).success(function(items) {
if(items.error !== undefined) {
console.log(items.error);
callback('Error with Dropbox API files list request'); // Do not alter string
return;
}
var empty = (items.length === 0) ? true : false;
callback(items, empty);
}).error(function(err) {
console.log(err);
callback('Error making ID request');
});
};
这是单元测试代码片段:
it('should request Dropbox file IDs at a give path - no errors but empty response', function() {
$httpBackend.expectPOST("/dropbox/getIds").respond({ data: [] });
dropboxService.getIds('path', function(items, empty) {
expect(items).to.deep.equal({data: []});
expect(empty).to.deep.equal(true);
});
});
'empty'变量在此测试中应为true,因为HTTP POST响应是一个空的'data'数组,但测试失败,因为'empty'变量实际上是假的。
有人可以在测试代码或服务方法本身中向我展示我做错了什么吗?
答案 0 :(得分:0)
编辑:
根据Angular文档(https://docs.angularjs.org/api/ng/service/ $ http),您处理回调返回的方式不正确。在您的测试中,项目将是
{
data: { data: [] } }
}
我认为你的三元应该看起来像
var empty = (items.data.data.length === 0) ? true : false;
然后,您需要将第一个断言更改为
expect(items.data).to.deep.equal({data: []});
原始帖子不正确:
您需要在要解决的承诺范围内调用摘要。看起来应该是这样的:
let scope;
beforeEach(() => {
inject($rootScope => {
scope = $rootScope.$new();
});
});
it('should request Dropbox file IDs at a give path - no errors but empty response', function(done) {
$httpBackend.expectPOST("/dropbox/getIds").respond({data: []});
dropboxService.getIds('path', function(items, empty) {
expect(items.data).to.deep.equal({data: []});
expect(empty).to.deep.equal(true);
done();
});
scope.$digest();
});