Reactjs mocha JSDOM测试react,getElementById返回null
我正在使用mocha和JsDom测试我的react组件 首先,我的组件工作得很好,所以这是测试环境的问题 情况: 我有一个组件,它呈现两个id为的Reactjs mocha JSDOM测试react,getElementById返回null,reactjs,mocha.js,jsdom,Reactjs,Mocha.js,Jsdom,我正在使用mocha和JsDom测试我的react组件 首先,我的组件工作得很好,所以这是测试环境的问题 情况: 我有一个组件,它呈现两个id为的select标记。然后在该组件中有一个componentDidMount,该组件将使用document.getElementById获取这些select标记并向其添加选项。但是,当我运行测试时,这些getElementById显示为null 现在,如果我注释掉componentDidMount,并断言下面这样的东西,它工作得很好,因此组件确实呈现了那些
select
标记。然后在该组件中有一个componentDidMount
,该组件将使用document.getElementById
获取这些select标记并向其添加选项。但是,当我运行测试时,这些getElementById
显示为null
现在,如果我注释掉componentDidMount
,并断言下面这样的东西,它工作得很好,因此组件确实呈现了那些select标记
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);
[...]
})
})
因此,在React中访问装载的DOM组件的规范方法是使用ref。而不是在组件中使用document.getElementById()。在呈现元素时,在元素上使用
ref={(element)=>{/*对元素执行类似的操作。element=element保存它*/}
。这将获得装载DOM元素的正确回调,而无需引用文档
如果可能的话,应该避免在React代码中使用文档,因为它使通用呈现变得不可能
(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;
}
}());