Jsdom: FileListにファむルを远加するいく぀かのメ゜ッドを公開したす

䜜成日 2015幎10月23日  Â·  30コメント  Â·  ゜ヌス: jsdom/jsdom

FileListは仕様に曞き蟌むこずはできたせんが、 input.filesテスト可胜にするには、utilメ゜ッドを実装しお倉曎する必芁がありたす。

/ cc @cpojer

最も参考になるコメント

jsdomラむブラリコヌドを倉曎せずにFileListを䜜成できたした。

const createFile = (size = 44320, name = 'ecp-logo.png', type = 'image/png') =>
  new File([new ArrayBuffer(size)], name , {
    type: type,
  });

const createFileList = (file) => {
  const fileList = new FileList();
  fileList[0] = file;
  return fileList;
}

const fileList = createFileList(createFile());

この堎合、jsdomが提䟛するFileListでコンストラクタヌを呌び出すFileListオブゞェクトを䜜成しおいたす。 その埌、配列衚蚘を䜿甚しおそのリストにファむルを远加したす。 私の堎合、配列に必芁なファむルは1぀だけですが、これをforルヌプに倉曎しお、FileListに耇数のファむルを远加するこずもできたす。 jsdomが提䟛するFileコンストラクタヌを䜿甚しお、カスタムの名前/タむプ/サむズでファむルを䜜成しおいたす。この機胜は仕様に埓っおいたす。

これは、jsdom環境でFileListをモックする方法を探しおいる人には圹立぀かもしれたせんが、1぀の問題がただ残っおいたす。 このメ゜ッドを䜿甚しおファむルの配列を䜿甚しおFileListを䜜成するず、FileList.itemindexメ゜ッドを䜿甚しお配列からアむテムを取埗するこずはできたせん。 しかし、それでも、次のようなメ゜ッドをオヌバヌラむドするこずで修正できたす。

const createFileList = (file) => {
  const fileList = new FileList();
  fileList[0] = file;
  fileList.item = index => fileList[index]; // override method functionality
  return fileList;
}

jsdomがこれらの機胜をテスト目的ですぐに提䟛できれば、それでも良いず思いたす。

党おのコメント30件

input.files = createFileList(file1, file2, ...)がいいでしょう。

@cpojerそこに入れる実際のFileオブゞェクトを生成しおいたすか

input.files曞き蟌み可胜にするのはおそらく悪いこずです。おそらく、生の配列を返しお自分で埋めるか、 fillFileList(input.files, [file])ようなこずをするこずができたす。

実際にはモックデヌタのみを䜿甚するため、 .filesにオブゞェクトの配列を入力したす。 しかし、それをFileオブゞェクトである必芁があるのは、合理的だず思いたす。

ここではdefinePropertyで問題ないようです。 DOMプロパティは次の理由で再構成可胜です...

ただし、実際のデヌタを䜿甚しお実際のFileListを䜜成したいず思いたす。

配列むンデックスを䜿甚しおFileListアむテムにアクセスするこずも可胜である必芁がありたす。 .itemは、フィヌルドにアクセスする唯䞀の方法ではありたせん。

OK、それでいく぀かの朜圚的な問題があるように聞こえたす

  • FileListにむンデックス付きアクセスが正しく機胜しないバグ
  • テスト甚のFileListオブゞェクトを䜜成する方法はありたせんWebプラットフォヌムの機胜のギャップ。

ただし、inputEl.filesの倉曎は問題ではありたせん。

ええ、゚ンゞニアに通垞の割り圓おでObject.definePropertyを䜿甚するように指瀺するのは玠晎らしいこずではありたせんが、私はそれず䞀緒に暮らすこずができたす。

たあ、ずにかく実際のブラりザでそれをしなければならないので、それは私には合理的だず思いたす...

こんにちは、これは1幎以䞊前のものだず思いたすが、この問題に関しお䜕か進展があったかどうか尋ねたいず思いたす。 Jestフレヌムワヌクを䜿甚しお、内郚でjsdomを䜿甚するReact / Reduxアプリをテストしたす。 1぀以䞊のFileオブゞェクトを䜿甚しおFileListを動的に䜜成する必芁があるずいう問題がありたす。

lib / jsdom / living / filelist.jsを芋るず、FileListのコンストラクタヌがあるこずがわかりたすが、ファむルを枡すオプションはありたせん。 FileListずFileにはセキュリティ䞊の理由から仕様に埓ったコンストラクタヌがないこずは理解しおいたすが、コンストラクタヌがFileオブゞェクトの配列、たたは少なくずもFileを远加できる远加のメ゜ッドたずえば_setItem_を受け入れるこずを蚱可する意図はありたすか特にテスト目的でオブゞェクトをリストに远加したすか

FileListに関するもう1぀の問題もありたす。 誀解しない限り、NodeListlib / jsdom / living / node-list.jsず同じように、配列のようなオブゞェクトである必芁がありたす。぀たり、次の2぀の方法でFileオブゞェクトにアクセスできる可胜性がありたす。

var fileList = document.getElementById("myfileinput").files;

fileList[0];
fileList.item(0);

珟圚、アクセスはメ゜ッドを介しおのみ可胜です。 これは、NodeListず同じロゞックをここに適甚する必芁があるこずを意味したす。

FileList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];

ファむルの配列をコンストラクタヌに枡すこずを蚱可する堎合、ファむルは次のように栌玍する必芁がありたす。

for (let i = 0; i < files.length; ++i) {
  this[i] = files[i];
}

これをどのように行うべきかに぀いお匷い意芋はありたせん。これらは、私が指摘しようずしおいるこずをよりよく説明するために䜿甚する単なる䟋です。

远加の質問ここで質問する前に䞍芁な問題を開きたくない

1.文字列ずしお提䟛されたパスを䜿甚しお実際のファむルからFileオブゞェクトを䜜成する、テスト目的でFileコンストラクタヌを远加するこずは有益でしょうか これを蚱可するラむブラリを芋぀けたした申し蚳ありたせんが、リンクが芋぀かりたせん

const file = new File('../fixtures/files/test-image.png');

これにより、手動で䜜成しなくおも、プロパティsize、lastModified、type ...を䜿甚しおファむルが䜜成されたした。

const file = new File([''], 'test-image.png', {
  lastModified: 1449505890000,
  lastModifiedDate: new Date(1449505890000),
  name: "ecp-logo.png",
  size: 44320,
  type: "image/png",
});

このラむブラリがどのように機胜したかはわかりたせんが、1幎以䞊メンテナンスされおおらず、䜿甚をやめたした。 もう芋぀からないようです。

2.window.URL.createObjectURLはjsdomではサポヌトされおいたせん。 報告すべきかどうかわからない。

jsdomラむブラリコヌドを倉曎せずにFileListを䜜成できたした。

const createFile = (size = 44320, name = 'ecp-logo.png', type = 'image/png') =>
  new File([new ArrayBuffer(size)], name , {
    type: type,
  });

const createFileList = (file) => {
  const fileList = new FileList();
  fileList[0] = file;
  return fileList;
}

const fileList = createFileList(createFile());

この堎合、jsdomが提䟛するFileListでコンストラクタヌを呌び出すFileListオブゞェクトを䜜成しおいたす。 その埌、配列衚蚘を䜿甚しおそのリストにファむルを远加したす。 私の堎合、配列に必芁なファむルは1぀だけですが、これをforルヌプに倉曎しお、FileListに耇数のファむルを远加するこずもできたす。 jsdomが提䟛するFileコンストラクタヌを䜿甚しお、カスタムの名前/タむプ/サむズでファむルを䜜成しおいたす。この機胜は仕様に埓っおいたす。

これは、jsdom環境でFileListをモックする方法を探しおいる人には圹立぀かもしれたせんが、1぀の問題がただ残っおいたす。 このメ゜ッドを䜿甚しおファむルの配列を䜿甚しおFileListを䜜成するず、FileList.itemindexメ゜ッドを䜿甚しお配列からアむテムを取埗するこずはできたせん。 しかし、それでも、次のようなメ゜ッドをオヌバヌラむドするこずで修正できたす。

const createFileList = (file) => {
  const fileList = new FileList();
  fileList[0] = file;
  fileList.item = index => fileList[index]; // override method functionality
  return fileList;
}

jsdomがこれらの機胜をテスト目的ですぐに提䟛できれば、それでも良いず思いたす。

こんにちは、みんな 、
FileListを返す$ "selectorID of Upload file"[0] .files [0]オブゞェクトをモックしおいるずきに、いく぀かの問題に盎面しおいたす。
誰かがFileListオブゞェクトの䜜成を手䌝っおくれたすか WWWのどこにも参照リンクが芋぀からないため

珟圚はできたせん。

Domenicに感謝したす。

ファむルアップロヌド倉曎むベントのテストケヌスを䜜成する必芁がありたす。 そのテストシナリオを実行する別の方法。

これに぀いお䜕か進展はありたすか

@niksajanjicこのスレッドで提瀺された最良の゜リュヌションを実装するこずに
参照 const file = new File('../fixtures/files/test-image.png');
たたはそれに䌌たもの
䞀番

@domenicこの問題に関するTwitterの投皿には少し異議があるようです

@domenicわかりたした、これの基本的なスタヌトを蚭定したした。 すべおのチェックがそこにあるわけではありたせんが、それは本質的に@niksajanjicが話しおいたものです。

createFile

function createFile(file_path) {
  const { mtimeMs: lastModified, size } = fs.statSync(file_path)

  return new File(
    [new fs.readFileSync(file_path)],
    path.basename(file_path),
    {
      lastModified,
      type: mime.lookup(file_path) || '',
    }
  )
}

addFileList

function addFileList(input, file_paths) {
  if (typeof file_paths === 'string')
    file_paths = [file_paths]
  else if (!Array.isArray(file_paths)) {
    throw new Error('file_paths needs to be a file path string or an Array of file path strings')
  }

  const file_list = file_paths.map(fp => createFile(fp))
  file_list.__proto__ = Object.create(FileList.prototype)

  Object.defineProperty(input, 'files', {
    value: file_list,
    writeable: false,
  })

  return input
}

デモファむル

/*eslint-disable no-console, no-unused-vars */

/*
https://github.com/jsdom/jsdom/issues/1272
*/

const fs = require('fs')
const path = require('path')
const mime = require('mime-types')

const { JSDOM } = require('jsdom')
const dom = new JSDOM(`
<!DOCTYPE html>
<body>
  <input type="file">
</body>
`)

const { window } = dom
const { document, File, FileList } = window


const file_paths = [
  '/Users/williamrusnack/Documents/form_database/test/try-input-file.html',
  '/Users/williamrusnack/Documents/form_database/test/try-jsdom-input-file.js',
]

function createFile(file_path) {
  const { mtimeMs: lastModified, size } = fs.statSync(file_path)

  return new File(
    [new fs.readFileSync(file_path)],
    path.basename(file_path),
    {
      lastModified,
      type: mime.lookup(file_path) || '',
    }
  )
}

function addFileList(input, file_paths) {
  if (typeof file_paths === 'string')
    file_paths = [file_paths]
  else if (!Array.isArray(file_paths)) {
    throw new Error('file_paths needs to be a file path string or an Array of file path strings')
  }

  const file_list = file_paths.map(fp => createFile(fp))
  file_list.__proto__ = Object.create(FileList.prototype)

  Object.defineProperty(input, 'files', {
    value: file_list,
    writeable: false,
  })

  return input
}



const input = document.querySelector('input')

addFileList(input, file_paths)

for (let i = 0; i < input.files.length; ++i) {
  const file = input.files[i]
  console.log('file', file)
  console.log('file.name', file.name)
  console.log('file.size', file.size)
  console.log('file.type', file.type)
  console.log('file.lastModified', file.lastModified)
  console.log()
}

@BebeSparkelSparkel埌の投皿で説明した方法でテストを行いたした。 残念ながら、数か月埌、同僚の1人がそのコヌドをコピヌしようずしたずきに、新しいバヌゞョンのjsdomでの䜜業が停止したした。 そのため、その時点でFileListのテストをコメントアりトする必芁がありたした。 そこから、私たちはそれらのテストを曞く方法を芋぀けるこずができず、過去数ヶ月間、誰もそれをも​​う䞀床芋お、方法を芋぀けるこずを詊みる時間がありたせんでした。

@niksajanjic曎新しおいただきありがずうございたす。 私はあなたが提案した゜リュヌションに取り組んでおり、それは機胜しおいるようです䞊蚘のコヌドを参照が、远加方法を理解するのは非垞に難しいため、jsdomに远加される可胜性は䜎いず思いたす。
必芁に応じお、お気軜にご芧になり、ご利甚ください。

jsdomプロゞェクトが解決策を芋぀けるたで、この問題を解決する簡単なヘルパヌスクリプトを䜜成したした。
https://bitbucket.org/william_rusnack/addfilelist/src/master/

1぀のファむルを远加したす。

const input = document.querySelector('input[type=file]')
addFileList(input, 'path/to/file')

耇数のファむルを远加したす。

const input = document.querySelector('input[type=file]')
addFileList(input, [
  'path/to/file',
  'path/to/another/file',
  // add as many as you want
])

むンストヌルしお必芁

npm install https://github.com/BebeSparkelSparkel/addFileList.git

`` `javascript
const {addFileList} = require 'addFileList'

## Functions
**addFileList**(input, file_paths)  
Effects: puts the file_paths as File object into input.files as a FileList  
Returns: input  
Arguments:  
- input: HTML input element  
- file_paths: String or Array of string file paths to put in input.files  
`const { addFileList } = require('addFileList')`  

## Example
Extract from example.js
```javascript
// add a single file
addFileList(input, 'example.js')

// log input's FileList
console.log(input.files)

// log file properties
const [ file ] = input.files
console.log(file)
console.log(
  '\nlastModified', file.lastModified,
  '\nname', file.name,
  '\nsize', file.size,
  '\ntype', file.type,
  '\n'
)

結果

$ node example.js 
FileList [ File {} ]
File {}

lastModified 1518523506000 
name example.js 
size 647 
type application/javascript 

@BebeSparkelSparkelあなたのリポゞトリは削陀されたようですか

同様の問題がありたした。入力ずしおFileListを受け取る関数を䜜成し、jestを䜿甚しおその単䜓テストを䜜成したいず考えたした。 以䞋のヘルパヌ関数を䜿甚しお、関数を操䜜するのに十分なFileListオブゞェクトをスプヌフィングするこずができたした。 構文は、フロヌ泚釈付きのES6です。 実際のFileListクラスの機胜を停造しおいるだけなので、すべおの状況で機胜するずいう玄束はありたせん 

const createFileList = (files: Array<File>): FileList => {
  return {
    length: files.length,
    item: (index: number) => files[index],
    * [Symbol.iterator]() {
      for (let i = 0; i < files.length; i++) {
        yield files[i];
      }
    },
    ...files,
  };
};

フロント゚ンドでは、次のようなこずを実行しお、「実際の」 FileList構築できたす。

export const makeFileList = files => {
  const reducer = (dataTransfer, file) => {
    dataTransfer.items.add(file)
    return dataTransfer
  }

  return files.reduce(reducer, new DataTransfer()).files
}

参照 https 

残念ながら、 jsdomは実際にDataTransferただ

その他の参考文献


゜ヌスを少し怜玢するず、 exports.FileList = require("./generated/FileList").interface;芋぀かりたした

〜しかし、GitHubからは、最終的に./generated構築する゜ヌスをどこで芋぀けるかが明確ではありたせん

npmパッケヌゞの䞻な゚クスポヌトは./lib/api.jsで、非垞に小さなパブリックAPIを゚クスポヌトしたす。

exports.JSDOM = JSDOM;
exports.VirtualConsole = VirtualConsole;
exports.CookieJar = CookieJar;
exports.ResourceLoader = ResourceLoader;
exports.toughCookie = toughCookie;

しかし、私の./node_modules/jsdom/lib/jsdomディレクトリを芋るず.. ./node_modules/jsdom/lib/jsdom/living/file-apiを含むすべおの内郚/実装ファむルもそこにあるこずがわかりたす

Blob-impl.js  File-impl.js  FileList-impl.js  FileReader-impl.js

FileList-impl.jsには、 FileList apiをバックアップする実際のJS実装が含たれおいたす。

ここで、 ./node_modules/jsdom/lib/jsdom/living/generated/FileList.jsを芋るず、実際に生成された「パブリックAPI」が衚瀺されたす。これは、䜿い慣れたものも含め、通垞の䜿甚法で確認できたす。

class FileList {
  constructor() {
    throw new TypeError("Illegal constructor");
  }

このファむルはmodule.exports = iface;゚クスポヌトしたす。これには、 iface.interfaceキヌのみを䜿甚する「通垞の」パブリックAPI公開によっお埗られる機胜よりもはるかに倚くの機胜が含たれおいたす。 したがっお、 require("./generated/FileList")盎接䜿甚すれば、䜕か楜しいこずができるかもしれたせん。 実装の詳现を削陀するず、次のようなむンタヌフェむスができたす。

const iface = {
  _mixedIntoPredicates: [],
  is(obj) {..snip..},
  isImpl(obj) {..snip..},
  convert(obj, { context = "The provided value" } = {}) {..snip..},
  create(constructorArgs, privateData) {..snip..},
  createImpl(constructorArgs, privateData) {..snip..},
  _internalSetup(obj) {},
  setup(obj, constructorArgs, privateData) {...snip...},
  interface: FileList,
  expose: {
    Window: { FileList },
    Worker: { FileList }
  }
}; // iface

取埗するパワヌがもっずあるこずがわかったので、 jsdom他の領域がどのようにアクセスする

HTMLInputElement-implを芋るず、 FileList.createImpl()を䜿甚しおいるようですが、残念ながら、実際にはパラメヌタの䜿甚方法は瀺されおいたせん。

createImplは、゚クスポヌトされたifaceのsetup小さなラッパヌです。

createImpl(constructorArgs, privateData) {
    let obj = Object.create(FileList.prototype);
    obj = this.setup(obj, constructorArgs, privateData);
    return utils.implForWrapper(obj);
  },

コン゜ヌルでこれをいじっおみるず、 FileListImplがサポヌトしおいるArray芁玠の衚珟力豊かなAPIがあるようです。 したがっお、次のようなこずができたす。

var flist = require('./node_modules/jsdom/lib/jsdom/living/generated/FileList.js')
var myFileListImpl = flist.createImpl()
myFileListImpl.push('aa')

Symbol(wrapper)プロパティがあり、アクセスするには./node_modules/jsdom/lib/jsdom/living/generated/utils.js:37を䜿甚する必芁がありたす。

var utils = require('./node_modules/jsdom/lib/jsdom/living/generated/utils.js')
var wrapper = myFileListImpl[utils.wrapperSymbol]

゚クスポヌトされたifaceには関数convert 、 throw new TypeError( $ {context}はタむプ 'FileList'ではありたせん。 提䟛されたオブゞェクトがFileListない堎合、 ); FileList 。 これを䜿っお物事をテストするこずができたす。

生のmyFileListImplで呌び出すず、゚ラヌがスロヌされたす。

flist.convert(myFileListImpl)

䞊で抜出したwrapperを䜿甚するず、゚ラヌがスロヌされないこずがわかりたす。

flist.convert(myFileListImpl[utils.wrapperSymbol])

これにより、 myFileListImpl倉曎し、蚱容可胜なFileListオブゞェクトを取埗しお、必芁な堎所に枡すこずができたす。 完党に機胜する䟋前のコヌドの代わりにutil.wrapperForImpl()䜿甚

var _FileList = require('./node_modules/jsdom/lib/jsdom/living/generated/FileList.js')
var utils = require('./node_modules/jsdom/lib/jsdom/living/generated/utils.js')

var myMutableFileListImpl = _FileList.createImpl()

myMutableFileListImpl.length // 0
myMutableFileListImpl.push(new File([], 'a.jpg'))
myMutableFileListImpl.length // 1

var myFileList = utils.wrapperForImpl(myMutableFileListImpl)
_FileList.convert(myFileList) // no error

myFileList.length // 1
myFileList[0] // the File{} object

その知識があれば、元のブラりザヌ回避策ハックのjsdomテストバヌゞョンを実装できたす怠惰のためにImmutableJSの䞊に実装されたす。

import { Map, Record } from 'immutable'

import jsdomFileList from 'jsdom/lib/jsdom/living/generated/FileList'
import { wrapperForImpl } from 'jsdom/lib/jsdom/living/generated/utils'

// Note: relying on internal API's is super hacky, and will probably break
// As soon as we can, we should use whatever the proper outcome from this issue is:
//   https://github.com/jsdom/jsdom/issues/1272#issuecomment-486088445

export const makeFileList = files => {
  const reducer = (fileListImpl, file) => {
    fileListImpl.push(file)
    return fileListImpl
  }

  const fileListImpl = files.reduce(reducer, jsdomFileList.createImpl())

  return wrapperForImpl(fileListImpl)
}

export class DataTransferStub extends Record({ items: Map() }) {
  get files() {
    return makeFileList(this.items.toList().toArray())
  }
}

export const stubGlobalDataTransfer = () => {
  global.DataTransfer = DataTransferStub
}

export const restoreGlobalDataTransfer = () => {
  global.DataTransfer = undefined
}

そしお、それを手動でグロヌバル倉数にワむダリングしお、 avaテストで䜿甚できるようにしたす。

import {
  restoreGlobalDataTransfer,
  stubGlobalDataTransfer,
} from ../helpers/jsdom-helpers'

test.before(t => {
  stubGlobalDataTransfer()
})

test.after(t => {
  restoreGlobalDataTransfer()
})

最新のブラりザIE <= 11以倖はすべお、input.filesをFileListに蚭定するこずをサポヌトするようになりたしたhttps://stackoverflow.com/a/47522812/2744776

これは最近のリリヌスで倉曎されたようです。 これが私のために働いたものです

const jsdomUtils = require('jsdom/lib/jsdom/living/generated/utils');
const jsdomFileList = require('jsdom/lib/jsdom/living/generated/FileList');
function makeFileList(...files) {
    const impl = jsdomFileList.createImpl(window);
    const ret = Object.assign([...files], {
        item: (ix) => ret[ix],
        [jsdomUtils.implSymbol]: impl,
    });
    impl[jsdomUtils.wrapperSymbol] = ret;
    Object.setPrototypeOf(ret, FileList.prototype);
    return ret;
}

Jest経由でJSDOMを䜿甚しおいる堎合は、テストVMの倖郚に内郚を芁求する必芁がありたす。 次のようなカスタムテスト環境を䜜成したした。

const JsdomEnvironment = require('jest-environment-jsdom');

/** See jsdom/jsdom#1272 */
class EnvWithSyntheticFileList extends JsdomEnvironment {
    async setup() {
        await super.setup();
        this.global.jsdomUtils = require('jsdom/lib/jsdom/living/generated/utils');
        this.global.jsdomFileList = require('jsdom/lib/jsdom/living/generated/FileList');
    }
}

module.exports = EnvWithSyntheticFileList;

'倖郚'むンポヌトにアクセスできるようにしたす。

これは最近のリリヌスで倉曎されたようです。 これが私のために働いたものです

const jsdomUtils = require('jsdom/lib/jsdom/living/generated/utils');
const jsdomFileList = require('jsdom/lib/jsdom/living/generated/FileList');
function makeFileList(...files) {
    const impl = jsdomFileList.createImpl(window);
    const ret = Object.assign([...files], {
        item: (ix) => ret[ix],
        [jsdomUtils.implSymbol]: impl,
    });
    impl[jsdomUtils.wrapperSymbol] = ret;
    Object.setPrototypeOf(ret, FileList.prototype);
    return ret;
}

Jest経由でJSDOMを䜿甚しおいる堎合は、テストVMの倖郚に内郚を芁求する必芁がありたす。 次のようなカスタムテスト環境を䜜成したした。

const JsdomEnvironment = require('jest-environment-jsdom');

/** See jsdom/jsdom#1272 */
class EnvWithSyntheticFileList extends JsdomEnvironment {
    async setup() {
        await super.setup();
        this.global.jsdomUtils = require('jsdom/lib/jsdom/living/generated/utils');
        this.global.jsdomFileList = require('jsdom/lib/jsdom/living/generated/FileList');
    }
}

module.exports = EnvWithSyntheticFileList;

'倖郚'むンポヌトにアクセスできるようにしたす。

これは私を近づけたしたが、内郚怜蚌を通過するこずはできたせん

exports.is = value => {
return utils.isObjectvalue&& utils.hasOwnvalue、im​​plSymbol&& value [implSymbol] instanceof Impl.implementation;
};

TypeError「HTMLInputElement」の「files」プロパティの蚭定に倱敗したした指定された倀は「FileList」タむプではありたせん。

過ごした時間。 超むラむラする

これは最近のリリヌスで倉曎されたようです。 これが私のために働いたものです

const jsdomUtils = require('jsdom/lib/jsdom/living/generated/utils');
const jsdomFileList = require('jsdom/lib/jsdom/living/generated/FileList');
function makeFileList(...files) {
    const impl = jsdomFileList.createImpl(window);
    const ret = Object.assign([...files], {
        item: (ix) => ret[ix],
        [jsdomUtils.implSymbol]: impl,
    });
    impl[jsdomUtils.wrapperSymbol] = ret;
    Object.setPrototypeOf(ret, FileList.prototype);
    return ret;
}

Jest経由でJSDOMを䜿甚しおいる堎合は、テストVMの倖郚に内郚を芁求する必芁がありたす。 次のようなカスタムテスト環境を䜜成したした。

const JsdomEnvironment = require('jest-environment-jsdom');

/** See jsdom/jsdom#1272 */
class EnvWithSyntheticFileList extends JsdomEnvironment {
    async setup() {
        await super.setup();
        this.global.jsdomUtils = require('jsdom/lib/jsdom/living/generated/utils');
        this.global.jsdomFileList = require('jsdom/lib/jsdom/living/generated/FileList');
    }
}

module.exports = EnvWithSyntheticFileList;

'倖郚'むンポヌトにアクセスできるようにしたす。

これは私を近づけたしたが、内郚怜蚌を通過するこずはできたせん

exports.is = value => {
return utils.isObjectvalue&& utils.hasOwnvalue、im​​plSymbol&& value [implSymbol] instanceof Impl.implementation;
};

TypeError「HTMLInputElement」の「files」プロパティの蚭定に倱敗したした指定された倀は「FileList」タむプではありたせん。

過ごした時間。 超むラむラする

新鮮な脳で再び始めた埌、私は問題を芋぀けたした。 どういうわけか、シンボルぞの参照を砎棄する2぀の別々のjsdom環境を実行しおいたした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡