【问题标题】:Simulate directory File object模拟目录文件对象
【发布时间】:2015-10-08 08:14:50
【问题描述】:

在 JavaScript 中,如何创建模拟目录的File(或Blob)对象?

在 Chrome 43 上,当我记录一个拖入上传表单的图像文件时,我得到以下信息:

lastModified: 1426770718000
lastModifiedDate: Thu Mar 19 2015 06:11:58 GMT-0700 (PDT)
name: "Cornered.jpg"
size: 261343
type: "image/jpeg"
webkitRelativePath: ""

当我记录一个目录时,我得到这个:

lastModified: 1426770841000
lastModifiedDate: Thu Mar 19 2015 06:14:01 GMT-0700 (PDT)
name: "contest"
size: 476
type: ""
webkitRelativePath: ""

唯一的区别似乎是缺少扩展名和空的type

This answer 描述了如何检测一个目录。我想模拟一个目录,这样我就可以为以下函数编写一个单元测试:

var isDirectory = function (blob, callback) {
    var reader = new FileReader();
    reader.addEventListener('load', function () {
        callback(false);
    });
    reader.addEventListener('error', function () {
        callback(true);
    });
    reader.readAsArrayBuffer(blob);
};

我尝试将new Blob([]) 传递给它,因为它也有一个空字符串type,但callback 仍然被false 调用。

【问题讨论】:

    标签: javascript html file dom directory


    【解决方案1】:

    如果您只想对该函数进行单元测试,您可以简单地模拟 JavaScript 的 FileReader

        describe('isDirectory', function () {
            var OriginalFileReader,
                MockFileReader = function () {
                    this.callbacks = {};
                    mockFileReaderInstance = this;
                },
                mockFileReaderInstance;
    
            MockFileReader.prototype = {
                addEventListener: function (event, callback) {
                    this.callbacks[event] = callback;
                },
                readAsArrayBuffer: angular.noop
            };
    
            beforeEach(function () {
                OriginalFileReader = window.FileReader;
                window.FileReader = MockFileReader;
            });
            afterEach(function () {
                window.FileReader = OriginalFileReader;
            });
    
            it('should indicate false when object is not a directory', function () {
                var spy = jasmine.createSpy('spy');
    
                fileUtilities.isDirectory({}, spy);
                mockFileReaderInstance.callbacks.load();
    
                expect(spy).toHaveBeenCalledWith(false);
            });
    
            it('should indicate true when object is a directory', function () {
                var spy = jasmine.createSpy('spy');
    
                fileUtilities.isDirectory({}, spy);
                mockFileReaderInstance.callbacks.error();
    
                expect(spy).toHaveBeenCalledWith(true);
            });
        });
    

    当然,这对FileReader 本身的内部运作做出了某些假设,但表面上它已经被浏览器制造商测试过,您可以假设它像广告宣传的那样运作。

    【讨论】:

      猜你喜欢
      • 2012-12-02
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2011-04-07
      相关资源
      最近更新 更多