【问题标题】:How to test that ReactDOM.render and another imported function were called in Jest?如何测试在 Jest 中调用了 ReactDOM.render 和另一个导入的函数?
【发布时间】:2017-06-12 01:32:21
【问题描述】:

这个问题类似于我打开的this previous one。但现在我使用的是不同的框架,Jest

我的代码是这样的:

import * as React from "react";
import * as ReactDOM from "react-dom";

import * as injectTapEventPlugin from "react-tap-event-plugin";

import Application from "./components/Application";

import "./assets/styles/theme.css";

injectTapEventPlugin();

ReactDOM.render(<Application />, document.getElementById("root"));

我想在这里测试 3 件事:

  1. injectTapEventPlugin() 被调用。
  2. ReactDOM.render 被调用时分别使用了预期的参数 &lt;Application /&gt;document.getElementById("root")
  3. ./assets/styles/theme.css 已导入。我知道这个很奇怪,但是这个导入在这里,以便 webpack 将其拾取并将其包含在最终包中。也许这个导入不应该存在,我应该确保theme.css 文件以其他方式加载。

我认为至少需要测试 1 和 2...Jest 使用 Jasmine2,我也在使用 Enzyme(但这在这里可能没有帮助)。

任何帮助表示赞赏:)

【问题讨论】:

    标签: unit-testing reactjs jasmine jestjs enzyme


    【解决方案1】:

    测试这个的问题是,模块只导入东西而不导出任何东西,这使得测试变得困难。所以你应该问自己的第一个问题是“为什么我需要测试这个”。因为这里发生的唯一想法是 2 个函数调用。

    测试#1 很简单,使用 spy 模拟模块,将其导入测试并检查 spy 是否被调用

    import * as injectTapEventPlugin from "react-tap-event-plugin"; 
    jest.mock('react-tap-event-plugin', ()=>jest.fn())
    
    expect(injectTapEventPlugin).toHaveBeenCalled()
    

    不确定在这种情况下import * as 语法是否存在问题。

    对于测试#2,我不确定它是否可以测试,因为您无法模拟 document.getElementBy,因为在您可以在测试中覆盖它之前调用它。

    【讨论】:

    • 是的,我必须在导入之前致电jest.mock,否则它将无法正常工作。但你是对的,我可能不需要测试这个......我的意思是,如果我没有正确调用 injectTapEventPluginReactDom.render,应用程序将根本无法工作......这是文件未来很可能不会有太大变化。只要每个组件都经过测试,这个文件就像“嘿,渲染应用程序”就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2019-06-26
    • 2018-04-03
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多