使用Karma模拟来自HTTP Post请求的空数组响应

时间:2016-12-23 11:35:12

标签: javascript angularjs arrays unit-testing karma-runner

我正在使用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'变量实际上是假的。

有人可以在测试代码或服务方法本身中向我展示我做错了什么吗?

1 个答案:

答案 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();
});