javascript - 如何在 Jasmine 中编写 FileReader 测试?

标签 javascript html unit-testing jasmine

我正在努力使这个测试工作,但我无法理解如何使用 FileReader 编写测试。这是我的代码


function Uploader(file) {
    this.file = file;
}

Uploader.prototype =  (function() {

    function upload_file(file, file_contents) {
        var file_data = new FormData()
        file_data.append('filename', file.name)
        file_data.append('mimetype', file.type)
        file_data.append('data', file_contents)
        file_data.append('size', file.size)

        $.ajax({
            url: "/upload/file",
            type: "POST",
            data: file_contents,            
            contentType: file.type,
            success: function(){

                // $("#thumbnail").attr("src", "/upload/thumbnail");    

            },
            error: function(){
                alert("Failed");
            },
            xhr: function() {
                myXhr = $.ajaxSettings.xhr();
                if(myXhr.upload){
                    myXhr.upload.addEventListener('progress',showProgress, false);
                } else {
                    console.log("Upload progress is not supported.");
                }
                return myXhr;
            }
        });
    }

    return {
        upload : function() {
            var self = this,
                reader = new FileReader(),
                file_content = {};

            reader.onload = function(e) {
                file_content = e.target.result.split(',')[1];

                upload_file(self.file, file_content);
            }
        }
    };
})();



这是我的测试


describe("Uploader", function() {
    it("should upload a file successfully", function() {
        spyOn($, "ajax");
        var fakeFile = {};

        var uploader = new Uploader(fakeFile);
        uploader.upload();

        expect($.ajax.mostRecentCall.args[0]["url"]).toEqual("/upload/file");
    })
});

但它永远不会到达 reader.onload

最佳答案

这里的问题是 reader.onload 的使用很难测试。您可以改用 reader.addEventListener,这样您就可以监视全局 FileReader 对象并返回一个模拟:

eventListener = jasmine.createSpy();
spyOn(window, "FileReader").andReturn({
 addEventListener: eventListener
})

然后你可以自己触发 onload 回调:

expect(eventListener.mostRecentCall.args[0]).toEqual('load');
eventListener.mostRecentCall.args[1]({
  target:{
    result:'the result you wanna test'
  }
})

关于javascript - 如何在 Jasmine 中编写 FileReader 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212348/

相关文章:

javascript - 根据数据属性将列表项分组为子列表

php - 带有 session 变量的查询语句

javascript - 如何将焦点交还给刚刚失去焦点的 DIV

java - 依赖常量值的单元测试代码

unit-testing - grails 单元测试中的 @ExpectedException

javascript - 为什么在 node.js 上使用 parse 时需要使用 "JavaScript key"?

javascript - 在 WooCommerce 存档产品类别描述上添加“阅读更多/阅读更少”按钮

javascript - 当我禁用标准浏览器使用 javascript 提交时,为什么 Ckeditor 值返回空?

javascript - 使用 css 或 javascript 将元素转换为 textarea?

javascript - 测试 JS 模块是否兼容 CommonJS 或 AMD