如何在javascript中模拟文件?

Eri*_*del 33 javascript tdd html5 unit-testing jasmine

我正在开发一些小项目来锻炼我的TDD技能.该项目包括一个音频播放器,它能够拖放播放列表中的文件.我正在使用Jasmine作为测试框架.我遇到的问题是我无法模拟javascript文件来测试我的文件上传功能.我试图像这样创建一个文件:

new File(new Blob(), "name");
Run Code Online (Sandbox Code Playgroud)

但Chrome不允许手动创建文件.File的构造函数是非法的.我找到了一个grunt.js的解决方案,它包含从grunt返回一些文件,但我真的不想在服务器端使用这么小的测试项目.这个问题有解决方法吗?

Chr*_*ber 51

Chrome会让您创建一个新文件:

var f = new File([""], "filename", { type: 'text/html' });
Run Code Online (Sandbox Code Playgroud)

但IE11(和其他浏览器?)不会.

这是我的(可怜?)假文件:

var blob = new Blob([""], { type: 'text/html' });
blob["lastModifiedDate"] = "";
blob["name"] = "filename";
var fakeF = blob;
Run Code Online (Sandbox Code Playgroud)

您可以根据需要填写值.你可以用你需要的任何东西填充blob.(有关如何使用图像,请参阅其他答案).

我在IE11,Chrome和Firefox中测试了这个.到目前为止,我似乎工作,至少我的单元测试目的.

额外奖励:这是打字稿:

let blob = new Blob([""], { type: 'text/html' });
blob["lastModifiedDate"] = "";
blob["name"] = "filename";

let fakeF = <File>blob;
Run Code Online (Sandbox Code Playgroud)


Bob*_*Bob 5

这是我创建一个虚拟 pdf 文件以供使用的方法pdf.js

  1. 创建文件的 base64 字符串。base64我在 shell 中使用命令。

    base64 < src/mockData/dummy.pdf
    #outputs something like: VEhJUyBJUyBUSEUgQU5TV0VSCg==
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将此字符串复制到您的源代码中。

    const dataBase64 = "VEhJUyBJUyBUSEUgQU5TV0VSCg==";
    //note this not a pdf, but for demo purposes because a pdf file is too big
    
    Run Code Online (Sandbox Code Playgroud)
  3. 解码base64并创建文件

    const arrayBuffer = Uint8Array.from(window.atob(dataBase64), c => c.charCodeAt(0));
    const file = new File([arrayBuffer], "dummy.pdf", {type: 'application/pdf'});
    
    Run Code Online (Sandbox Code Playgroud)