Как использовать File.text() в шутку?

#reactjs #testing #jestjs #react-testing-library

#reactjs #тестирование #jestjs #react-тестирование-библиотека

Вопрос:

У меня возникли некоторые проблемы с выполнением некоторых тестов. После нескольких часов, потерянных на попытки выяснить, что происходит, я понял, что у jest есть некоторые проблемы с Files

Я написал простой тест, чтобы ожидать от содержимого файла:

 describe(".file test", () => {
    test("jest can work whit files", async () => {
      const aContent = "a_content";      
      const file = new File([aContent], "aFile.txt");
      const fileContent = await file.text()
      expect(fileContent).toBe(aContent)
    })
 )
  

Этот простой код работает, когда выполняется в реальном приложении в браузере. Однако, когда я запускаю набор тестов, я просто получаю сообщение об ошибке:

Ошибка типа: file.text не является функцией

   30 |       const aContent = "a_content";
  31 |       const file = new File([aContent], "aFile.txt");
> 32 |       const fileContent = await file.text()
     |                                      ^
  33 |       expect(fileContent).toBe(aContent)
  

Итак, что мне нужно, чтобы jest мог работать с файлами?

Комментарии:

1. Есть способ. Макет File . text был недавно добавлен и не следует ожидать, что он будет существовать в JSDOM.

2. Я не хочу издеваться File.text потому что в реальных тестах мне нужно, чтобы функция возвращала фактическое содержимое файла. Если я использую mockImplementation , это скроет фактическое поведение приложения, а также, в тестируемом объекте считывается несколько файлов, поэтому он должен возвращать разное содержимое для каждого ime.

3. Я не вижу проблем с несколькими файлами. Jest spy может быть снабжен новой реализацией каждый раз, когда вам это нужно. Jest’s DOM не должен и не может вести себя как реальная вещь. Это Node.js среда с поддельным DOM, а не браузер. Если вы хотите проверить, как это работает на самом деле, используйте безголовый браузер (Puppeteer).

4. Вы ищете модульное тестирование, интеграционное тестирование или тестирование E2E?

5. Я ищу модульное тестирование. Однако я нашел обходной путь благодаря комментариям @EstusFlask

Ответ №1:

Наконец-то я нашел обходной путь благодаря комментариям @EstusFlask.

Я издевался File.prototype.text , чтобы вернуть сам объект file. Тогда я смогу прочитать его содержимое при тестировании с помощью FileReader .