使用$ httpBackend的promise通知测试进度

时间:2014-11-17 13:55:00

标签: javascript angularjs

我正在使用https://github.com/danialfarid/angular-file-upload进行文件上传。当xhr请求收到progress事件时,它提供一个progress方法。这是来自angular-file-upload的源代码:

xhr.upload.addEventListener('progress', function(e) {
    deferred.notify(e);
}, false);

我现在的问题是,我应该如何使用$httpBackend进行测试?我可以用

测试成功和错误方法
$httpBackend.expectPOST("http://localhost:9001/").respond('ok');
$httpBackend.expectPOST("http://localhost:9001/").respond(500, 'some error');

但是我无法获得承诺的notify。有没有办法做到这一点?

修改

我要测试的部分位于progress方法中:

    $upload.http({url: url, method: 'POST', data: file})
    .progress(function(evt) {

      // here is more code, that needs to be tested

      self.$deferreds.upload.notify((100.0 * evt.loaded / evt.total).toFixed(2));
    }).success(function(data, status, headers, config) {
      self.$deferreds.upload.resolve(data);
    }).error(function(response) {
      self.$deferreds.upload.reject(response);
    });

2 个答案:

答案 0 :(得分:1)

你想窥探$upload.http方法并返回一个模拟对象,让你注册进度,成功和错误回调。

spyOn($upload, 'http').andReturn({
  progress: function (progressCallback) {
    this.progressCallback = progressCallback;
  },
  success: function (errorCallback) {
    this.errorCallback = errorCallback;
  },
  error: function (errorCallback) {
    this.errorCallback = errorCallback;
  }
});

然后你可以在测试中同步调用这些回调:

it('should do something', function () {
  $upload.progressCallback();
  // or $upload.successCallback();
  // or $upload.errorCallback();

  expect('this').toBe('that');
});

答案 1 :(得分:0)

我们在谈论单元测试?

为什么你需要测试第三方?

只需模拟这一部分

可能我没有理解这个问题,所以需要更多应该由测试覆盖的代码。