用 Jasmine 伪造 FormData 附加

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 方法。

Jon*_*ins 6

事实证明我错了,下面的代码实际上正确地监视了该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 的人!