伪造FormData附加Jasmine

时间:2014-07-10 22:29:00

标签: unit-testing jasmine form-data

我需要测试一个构造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方法。

1 个答案:

答案 0 :(得分:3)

原来我错了,以下代码确实在FormData.append方法上进行了间谍:

spyOn(FormData.prototype, "append");

问题在于我把它嵌套在我的describe块中,以至于其他测试都失败了,因为他们也试图调用FormData.append而没有为这些测试设置间谍。

当我正在研究解决方案时,我也意识到以下概念也会起作用,因为我实际上并不关心上传任何文件:

spyOn(window, 'FormData').andReturn({
    "append": jasmine.createSpy()
});

希望这可以帮助那些需要监视FormData的人!