如何在javascript中模拟文件?

如何在javascript中模拟文件?,javascript,html,unit-testing,tdd,jasmine,Javascript,Html,Unit Testing,Tdd,Jasmine,我正在开发一些小项目来锻炼我的TDD技能。该项目包括一个音频播放器,它能够在播放列表中拖放文件。我使用Jasmine作为测试框架。我面临的问题是,我无法模拟javascript文件来测试我的文件上传功能。我尝试创建如下文件: new File(new Blob(), "name"); 但是Chrome不允许手动创建文件。使用文件的构造函数是非法的。我用grunt.js找到了一个解决方案,其中包括从grunt返回一些文件,但我真的不想在这么小的测试项目中使用服务器端。这个问题有什么解决方法吗?您

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

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

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

您不需要创建blob,您可以直接应用正版图像字符串(我使用过),也可以按照下面的示例进行操作(如果您实际上不关心是否有有效的图像):

html


该函数仅用于从字符串创建base64。

Chrome将允许您创建一个新文件:

var img = window.btoa('I don't care about a broken image');
document.getElementById('test').src='data:image/png;base64,'+img;
但是IE11(和其他浏览器?)不会

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

var f = new File([""], "filename", { type: 'text/html' });
您可以根据需要填写这些值。你可以用你需要的任何东西来填充这个斑点。(有关如何使用图像,请参见其他答案)

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

奖金: 这里是typescript:

var blob = new Blob([""], { type: 'text/html' });
blob["lastModifiedDate"] = "";
blob["name"] = "filename";
var fakeF = blob;
let blob=new blob([“”],{type:'text/html'});
blob[“lastModifiedDate”]=“”;
blob[“名称”]=“文件名”;
让fakeF=blob;

以下是我如何创建一个虚拟pdf文件,用于
pdf.js

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

    let blob = new Blob([""], { type: 'text/html' });
    blob["lastModifiedDate"] = "";
    blob["name"] = "filename";
    
    let fakeF = <File>blob;
    
  • 解码base64并创建一个文件

    const dataBase64 = "VEhJUyBJUyBUSEUgQU5TV0VSCg==";
    //note this not a pdf, but for demo purposes because a pdf file is too big
    

  • 当我说你不需要创建blob时,你实际上是在创建一个bloburl。所有blob URL实际上都是二进制图像数据的base64副本,在开始时有一些元信息来描述它的内容。Thx。请注意,在使用PhantomJS进行单元测试时,将Blob转换为文件也是非常有用的,因为PhantomJS也不允许文件实例化!我的代码正在检查值是否为instanceof File,我试图用new File替换新的Blob,但它提供了一个空的File对象。无法设置大小等等。谢谢,对我有用!最后有效的解决方案。非常感谢!
    const dataBase64 = "VEhJUyBJUyBUSEUgQU5TV0VSCg==";
    //note this not a pdf, but for demo purposes because a pdf file is too big
    
    const arrayBuffer = Uint8Array.from(window.atob(dataBase64), c => c.charCodeAt(0));
    const file = new File([arrayBuffer], "dummy.pdf", {type: 'application/pdf'});