Javascript 模拟目录文件对象

Javascript 模拟目录文件对象,javascript,html,file,dom,directory,Javascript,Html,File,Dom,Directory,在JavaScript中,如何创建模拟目录的文件(或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

在JavaScript中,如何创建模拟目录的
文件
(或
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: ""
当我记录目录时,我得到以下信息:

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: ""
唯一的区别似乎是缺少扩展和空的
类型

描述如何检测目录。我想模拟一个目录,以便为以下函数编写单元测试:

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

我试着给它传递一个
新Blob([])
,因为它也有一个
类型
的空字符串,但是
回调
仍然是用
false

调用的。如果您只想对该函数进行单元测试,您可以简单地模拟JavaScript的
文件阅读器

    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);
        });
    });

诚然,这对
文件阅读器本身的内部工作做了一定的假设,但表面上它已经被浏览器制造商测试过了,你可以假设它可以像广告一样工作。

如果你只想对该函数进行单元测试,你可以简单地模仿JavaScript的
文件阅读器

    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);
        });
    });
诚然,这对
文件阅读器本身的内部工作原理做出了某些假设,但表面上看,浏览器制造商已经对其进行了测试,您可以假设其工作原理是广告化的