Jon*_*ins 3 unit-testing form-data jasmine
我需要测试构建 FormData 对象、附加文件并向服务器提交 AJAX 请求的代码单元。问题是我实际上没有文件对象提供给 FormDataappend方法调用。所以我想监视该append方法并调用我自己的假函数。这可能吗?如果没有,我该如何测试我的代码。
以下是我要测试的代码单元:
var fd = new FormData();
// listOfFiles is an array of files and filename is a string
var file = _.findWhere(listOfFiles, { name: filename });
fd.append("file", file, filename);
$.ajax(/* options */);
Run Code Online (Sandbox Code Playgroud)
以下是我的单元测试,但它不起作用:
it("does something", function() {
var mockFiles = [{
name: "Test File.pdf"
}];
// the addDocs call adds the files to the listOfFiles array above
someView.addDocs(mockFiles);
var ajaxSpy = spyOn($, "ajax");
// THIS DOESN'T WORK
spyOn(FormData.prototype, "append").andReturn(false);
// this event causes the above unit of code to run
app.trigger('someEvent');
// do more stuff...
});
Run Code Online (Sandbox Code Playgroud)
现在我收到以下错误:
Failed to execute 'append' on 'FormData': No function was found that matched the signature provided
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为我的间谍没有接到电话。
非常感谢任何帮助如何正确监视 FormData 方法。
事实证明我错了,下面的代码实际上正确地监视了该FormData.append方法:
spyOn(FormData.prototype, "append");
Run Code Online (Sandbox Code Playgroud)
问题是我把它嵌套在我的描述块中太远,导致其他测试失败,因为它们也尝试调用FormData.append并且没有为这些测试设置间谍。
当我正在研究解决方案时,我还意识到以下概念也适用,因为我实际上并不关心上传任何文件:
spyOn(window, 'FormData').andReturn({
"append": jasmine.createSpy()
});
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助需要监视 FormData 的人!