gpt4 book ai didi

reactjs - mocha JSDOM 在 React 上测试,getElementById 返回 null

转载 作者:行者123 更新时间:2023-12-02 16:32:23 26 4
gpt4 key购买 nike

我正在使用 mocha 和 JsDom 来测试我的 React 组件。

首先我的组件工作得很好,所以这是测试环境的问题。

情况:

我有一个组件,可以呈现几个带有 id 的 select 标记。然后组件中的 componentDidMount 将使用 document.getElementById 获取这些选择标签并向其添加选项。但是当我运行测试时,这些 getElementById 显示为 null。

现在,如果我注释掉 componentDidMount,并断言如下所示的内容,它会完美地工作,因此组件确实渲染出了这些选择标签。

    describe('test component', function(){
var renderedElement = ReactTestUtils.renderIntoDocument(<Component/>);
var renderedNode = ReactDom.findDOMNode(renderedElement);
it('should have the proper markup', function(){
assert.equal(renderedNode.childElementCount, 5);
[...]
})
})

是什么导致了这个问题?是否是因为我的测试环境中不存在 document.getElementById 文档对象,导致我使用了“假”文档对象,如果是这样,我应该如何测试它?

下面是我的 mocha jsdom 设置

    (function () {
'use strict';

var jsdom = require('jsdom'),
baseHTML,
window;

if (!global.window) {
baseHTML = '<!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"><title>Tests</title></head><body></body></html>';
window = jsdom.jsdom(baseHTML).defaultView;

global.window = window;
global.document = window.document;
global.navigator = window.navigator;
}

}());

最佳答案

因此,在 React 中访问已安装 DOM 组件的规范方法是使用 ref。不要在 componentDidMount 中使用 document.getElementById() ,而是使用 ref={(element) => {/* 对像 this.element = element 这样的元素执行一些操作来保存它 */}}渲染时的元素。这将使用已安装的 DOM 元素获得正确的回调,而无需引用文档。

如果可能的话,应该在 React 代码中避免使用文档,因为它使得无法进行通用渲染。

关于reactjs - mocha JSDOM 在 React 上测试,getElementById 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com