【问题标题】:How to properly unit test ReactDOM.render with Karma and PhantomJS?如何使用 Karma 和 PhantomJS 正确地对 ReactDOM.render 进行单元测试?
【发布时间】:2017-01-18 19:40:40
【问题描述】:

假设我在Index.tsx 上有以下内容:

ReactDOM.render(
    <h2 style={{textAlign: "center"}}>Hello World</h2>,
    document.getElementById("wrapper")
);

首先,我如何对ReactDOM.render 调用进行单元测试?其次,在 Karma + PhantomJS 上运行,我得到以下错误:

不变违规: _registerComponent(...): 目标容器不是 DOM 元素。

在 /tmp/karma-typescript-bundle-192osSfGKwYIxIW.js:188

这是因为document.getElementById("wrapper") 无法在 PhantomJS 下工作,因为没有 wrapper 元素。

解决此问题的最佳方法是什么?无论如何我可以在 PhantomJS 上插入/模拟一次 wrapper 元素吗?

【问题讨论】:

    标签: unit-testing reactjs phantomjs karma-runner karma-mocha


    【解决方案1】:

    如果 DOM 中没有 #wrapper 元素,您必须创建它并在运行特定测试之前准备环境。您可以使用jsdom,它可以帮助您在测试之间创建和维护 DOM。

    React 有一个用于编写单元测试的官方包,称为 react-addons-test-utils。它使在您选择的测试框架中测试 React 组件变得容易。

    更多信息可以在官方文档中找到:https://facebook.github.io/react/docs/test-utils.html

    我向您推荐另一种解决方案。 Airbnb 发布了Enzyme,这使得编写单元测试变得超级容易。 API 有很好的文档记录并且很直接。 Test Utilities - React 文档中甚至还有关于酶的信息。

    Airbnb has released a testing utility called Enzyme, 
    which makes it easy to assert, manipulate, and traverse your React
    Components' output. If you're deciding on a unit testing utility to
    use together with Jest, or any other test runner, 
    it's worth checking out: http://airbnb.io/enzyme/
    

    在 Github 上,您几乎可以找到每个测试框架的入门者,甚至还有 starter for Karma with sample repositories

    最后一件事是,如果您决定使用 jsdomreact-addons-test-utilsenzyme,则不再需要 PhantomJS,因为您的所有测试都可以在 Node.js 中运行,这将使您的测试也更快。


    这是每个工具为您作为开发人员提供的解释:

    • Mocha - 它是一个测试框架和一个测试运行器。
    • Karma - 这是一个测试运行器
    • Jasmine - 这是一个测试框架
    • Sinon - 这是一个模拟库
    • ReactTestUtils - 这是一个小包,可以更轻松地测试 React 组件
    • Enzyme - 它建立在 ReactTestUtils 和 jsdom 之上,但它提供了友好的开发人员 API。让测试 React 组件变得更加容易。
    • jsdom - 这是一个模拟节点内的网络浏览器的小包

    请记住,像 Jasmine 这样的一些测试框架还为您提供了一些模拟功能,因此您不需要 Sinon。

    您可以将enzyme 与任何测试运行程序和框架一起使用。 您可以将它与 Karma 和 Jasmine 一起使用。 你可以将它与摩卡一起使用。 您可以将它与 Jest 一起使用。 有很多测试框架和运行器;)

    【讨论】:

    • 我对@9​​87654334@ 感到困惑...如果我使用 Enzyme + Karma,我仍然需要 PhantomJS(或真正的浏览器)并且最初的问题仍然存在。那么,酶有什么帮助呢?
    • 作为记录,我用于单元测试的完整工具集是:Karma(使用 karma-typescript 提供良好的覆盖率报告,而不会弄乱 webpack)、Mocha、Chai、Sinon、React Test Utils、PhantomJS。跨度>
    • 您不需要 PhantomJS 或任何浏览器,因为 Web 环境是由 jsdom “模拟”的,所有测试都可以在 Node 内运行而无需生成任何浏览器。请看这篇文章《从Karma到Mocha,带着jsdom的味道》,应该会一清二楚-medium.com/podio-engineering-blog/…
    • (还没看文章) 简而言之,你是在建议jsdom +酵素,是吗?我仍然对 Enzyme 感到有点不知所措......它是否以任何方式取代了 Mocha/Chai/Sinon/React TestUtils 或者它们都相互补充?如果是这样,酶到底有什么其他4个一起没有的?我只是想了解我是否应该简单地将 Karma 迁移到 jsdom(并保留所有其余部分)或使用 Enzyme 将 Karma 迁移到 jsdom 并摆脱任何 Mocha/Chai/Sinon/React TestUtils 包?
    • @RicardoAmaral 我编辑了我的答案,因为我的评论太大了。 Enzyme 不能替代 Mocha、Chai、Karma、Jasmine。它是 RestTestUtils 的替代品,因为它建立在它之上。只需将酶与 Karma 和 Jasmine 一起使用,您就不必迁移。 Enzyme 不是测试框架或运行器。
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2014-01-30
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多