2015-07-18 46 views
1

在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

回答

0

如果你想要做的是单元测试的功能,你可以简单地模拟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本身的内部运作的某些假设,但是表面上它已经被由浏览器制造商进行测试,您可以假设它的工作原理与广告相同