调试模拟httpbackend请求

时间:2017-05-14 13:48:48

标签: javascript angularjs unit-testing mocking angular-file-upload

我的情况是有很多模拟的http请求。在进行角度上传时,在我的情况下发生了一些可疑的事情。它总是抛出status:200 successhtml complete body response

以下是我的角度上传代码:

function fileUploadController(FileUploader) {
    /* jshint validthis: true */
    let vm = this;
    vm.type = this.type;
    vm.clientId = this.client;

    let uploader = new FileUploader({
        url: 'http://localhost:8001/prom-scenario-config/files?clientId=' + vm.clientId,
        data: {type: vm.type}
    });

    vm.uploads = {uploader};
    vm.upload = upload;
    vm.uploads.uploader.queue = [];

    vm.uploads.uploader.onCompleteItem = function (item, response) {
        let type = item.uploader.data.type;
        console.log('response => ', response);
    };
 }

模拟httpbackend代码如下所示:

$httpBackend.whenPOST(new RegExp('http://localhost:8001/prom-scenario-config/files\\?clientId=([a-zA-Z0-9-])$$'))
  .respond(function () {
   return [200, 'foo'];
});

但对此没有任何影响。

构建时我的正则表达式代码是否有任何错误? 有或没有模拟代码。我收到的回复仍然是200。

有很多模拟请求,我很难确定正在调用哪个请求。

是否有任何棘手的方法来识别调用哪个正则表达式调用?或者强制我的模拟请求?

以下是状态和响应FYI的参考。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

单元测试假设单元是单独测试的。任何其他不是经过测试的单位的东西,即控制器都应该被嘲笑,特别是第三方单位。

考虑到它是使用Jasmine进行测试的,FileUpload服务应该是存根的:

beforeEach(() => {
  // a spy should be created inside beforeEach to be fresh every time
  module('app', { FileUpload: jasmine.createSpy() });
});

然后逐行测试控制器,如:

it('...', inject(($controller, FileUpload) => {

  const ctrl = $controller('fileUploadController');
  ...
  expect(FileUpload).toHaveBeenCalledTimes(1);
  expect(FileUpload).toHaveBeenCalledWith({ url: '...', type: {...} });

  // called with new
  const fileUpload = FileUpload.calls.first().object;
  expect(fileUpload instanceof FileUpload).toBe(true);

  expect(ctrl.fileUpload).toBe(fileUpload);
  expect(fileUpload.onCompleteItem).toEqual(jasmine.any(Function));
  expect(fileUpload.queue).toEqual([]);
  ...
}));

在上面的代码clientId=([a-zA-Z0-9-])中,regexp部分仅匹配由单个字符组成的id,这不是真的。这就是为什么在单元测试中硬编码值的原因,人为错误更易于发现和检测。当测试过于宽松时,无法明确地识别问题,这会导致浪费时间。