#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
.