我的情况是有很多模拟的http请求。在进行角度上传时,在我的情况下发生了一些可疑的事情。它总是抛出status:200 success
和html 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的参考。
答案 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,这不是真的。这就是为什么在单元测试中硬编码值的原因,人为错误更易于发现和检测。当测试过于宽松时,无法明确地识别问题,这会导致浪费时间。