Как проверить с Jest, что ReactDOM.render был вызван, когда он был заключен в условное выражение?

У меня есть следующий реагирующий компонент и он условно вызывает ReactDOM.render если root === true чтобы удовлетворить flow:

import React from 'react'
import ReactDOM from 'react-dom'

import App from './App'

const root = document.getElementById('root')

if (root !== null) {
  ReactDOM.render(<App />, root)
}

Проблема в том, что этот тест больше не равен истине, вероятно, потому, что условное обертывание должно быть смоделировано как истина или что-то еще, но я не могу понять это.

import ReactDOM from 'react-dom'

jest.mock('react-dom')

require('../index')

test('Renders the application', () => {
  expect(ReactDOM.render).toBeCalled()
})

Как мне обновить мой тест, чтобы проверить, что ReactDOM.render называется?

1 ответ

Решение

Я думаю, что этот контрольный пример является избыточным, так как вам нужно будет смоделировать документ и визуализировать функцию, так что в основном то, что вы тестируете, является лишь условным. Но может быть похожий вариант использования. Вы должны внести следующие изменения в код.

function renderToDOM() {
    if (root !== null) {
        ReactDOM.render(<App />, root)
    }
}
renderToDOM();
export {renderToDOM};

Сделав это изменение, мы сможем написать чистый тест и протестировать только этот фрагмент кода независимо. Ниже приведен тест, который сработал для меня. Пришлось смоделировать ReactDOM.render, а также document.getElementById, чтобы заставить тестовый пример работать.

import ReactDOM from "react-dom";
import { mock } from "jest";
import { renderToDOM } from "./index";

describe("test ReactDOM.render", () => {
  const originalRender = ReactDOM.render;
  const originalGetElement = global.document.getElementById;
  beforeEach(() => {
    global.document.getElementById = () => true;
    ReactDOM.render = jest.fn();
  });
  afterAll(() => {
    global.document.getElementById = originalGetElement;
    ReactDOM.render = originalRender;
  });
  it("should call ReactDOM.render", () => {
    renderToDOM();
    expect(ReactDOM.render).toHaveBeenCalled();
  });
});

Ниже приведена ссылка на изолированную программную среду кода, где вы можете увидеть, как проходит этот тест, и тесты проходят https://codesandbox.io/s/7wr0k7qmq

Другие вопросы по тегам