如何在javascript中模拟文件?

时间:2014-06-30 11:21:13

标签: javascript html5 unit-testing tdd jasmine

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

new File(new Blob(), "name");

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

3 个答案:

答案 0 :(得分:38)

Chrome可让您创建新文件:

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

然而,IE11(和其他浏览器?)不会。

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

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

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

我已经在IE11,Chrome和Firefox中对此进行了测试。到目前为止,我似乎工作,至少为我的单元测试目的。

加成: 这是打字稿:

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

let fakeF = <File>blob;

答案 1 :(得分:3)

这是我创建与pdf.js一起使用的虚拟pdf文件的方式

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

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

    const dataBase64 = "VEhJUyBJUyBUSEUgQU5TV0VSCg==";
    //note this not a pdf, but for demo purposes because a pdf file is too big
    
  3. 解码base64并创建一个文件

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

答案 2 :(得分:1)

你不需要创建一个blob,你可以do this直接应用真正的图像字符串(我使用this converter),或者你可以按照下面的例子(如果你不是)实际上关心有一个有效的图像]):

html <img id="test" />

var img = window.btoa('I don't care about a broken image');
document.getElementById('test').src='data:image/png;base64,'+img;

btoa函数只是从字符串创建base64。