如何在Jest中调用ReactDOM.render和另一个导入的函数?

时间:2017-01-26 14:34:40

标签: unit-testing reactjs jasmine jestjs enzyme

这个问题类似于我打开的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分别使用预期参数<Application />document.getElementById("root")进行了调用。
  3. 导入了./assets/styles/theme.css。我知道这个很奇怪但是这个导入就在这里,以便webpack选择它并将其包含在最终的包中。也许这个导入不应该存在,我应该确保theme.css文件以其他方式存在。
  4. 我认为至少需要测试1和2 ... Jest使用Jasmine2而我也使用Enzyme(但这可能对此没有帮助。)

    感谢任何帮助:)

1 个答案:

答案 0 :(得分:1)

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

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

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

expect(injectTapEventPlugin).toHaveBeenCalled()

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

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