【问题标题】:How to mock File in javascript?如何在javascript中模拟文件?
【发布时间】:2014-08-20 18:10:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript html unit-testing tdd jasmine


    【解决方案1】:

    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;
    

    【讨论】:

    • 谢谢。请注意,在使用 PhantomJS 进行单元测试时,将 Blob 转换为文件也非常有用,它也不允许文件实例化!
    • 我的代码正在检查值是否为instanceof File,我试图用新文件替换新的Blob,但它给出了一个空文件对象。
    • 无法设置大小等,但是。
    • 终于!一个有效的解决方案。非常感谢!
    • 你刚刚救了我的命
    【解决方案2】:

    以下是我创建一个虚拟 pdf 文件以与 pdf.js 一起使用的方法

    1. 创建文件的 base64 字符串。我在 shell 中使用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'});
      

    【讨论】:

      【解决方案3】:

      你不需要创建一个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。

      【讨论】:

      • 当我说您不需要创建 blob 时,实际上是在创建 blob URL。所有的 blob URL 都是二进制图像数据的 base64 副本,开头有一些元信息来描述它的内容。
      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 2015-09-19
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      相关资源
      最近更新 更多