2015-07-18 49 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本身的內部運作的某些假設,但是表面上它已經被由瀏覽器製造商進行測試,您可以假設它的工作原理與廣告相同