【问题标题】:How to test with Jest that ReactDOM.render has been called when it has been wrapped in a conditional?如何用 Jest 测试 ReactDOM.render 是否在被包装在条件中时被调用?
【发布时间】:2019-02-26 19:39:09
【问题描述】:

我有以下反应组件,它有条件地调用ReactDOM.render if 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 是否被调用?

【问题讨论】:

    标签: javascript reactjs jestjs


    【解决方案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

    【讨论】:

    • 谢谢,有道理!我担心我正在创建一个冗余测试 tbh,但不确定如何最好地去做
    • 可能你只是在编写这个测试用例来提高代码覆盖率,但在我看来,这种情况可以忽略不计。
    • 是的,你是对的,此时只是为了覆盖而进行测试!
    • 应用程序渲染是否包含在我的 E2E 测试中,因此几乎没有必要
    • 正是我认为无论测试用例通过还是失败都需要渲染应用程序,更多的是一个 ui 测试用例。是否按预期呈现是 js 测试用例的范围。但是不知何故,使用 require 在我看来根本不对。所以写了这个测试用例。
    猜你喜欢
    • 2020-10-15
    • 2020-05-22
    • 2019-10-08
    • 2012-03-06
    • 1970-01-01
    • 2018-10-24
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多