我需要测试一个构造FormData对象的代码单元,附加一个文件并向服务器提交一个AJAX请求。问题是我实际上没有要提供给FormData append
方法调用的文件对象。所以我想窥探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 */);
以下是我的单元测试所用的内容,它不能完成这项工作:
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...
});
现在我收到以下错误:
Failed to execute 'append' on 'FormData': No function was found that matched the signature provided
这是因为我的间谍没有被召唤。
非常感谢如何正确监视FormData方法。
答案 0 :(得分:3)
原来我错了,以下代码确实在FormData.append
方法上进行了间谍:
spyOn(FormData.prototype, "append");
问题在于我把它嵌套在我的describe块中,以至于其他测试都失败了,因为他们也试图调用FormData.append
而没有为这些测试设置间谍。
当我正在研究解决方案时,我也意识到以下概念也会起作用,因为我实际上并不关心上传任何文件:
spyOn(window, 'FormData').andReturn({
"append": jasmine.createSpy()
});
希望这可以帮助那些需要监视FormData的人!