mocha JSDOM 测试反应,getElementById return null
mocha JSDOM testing on react, getElementById return null
我正在使用 mocha 和 JsDom 来测试我的 React 组件。
首先我的组件工作完美,所以它是测试环境的问题。
情况:
我有一个组件可以呈现几个带有 id 的 select
标签。然后组件中的 componentDidMount
将使用 document.getElementById
获取那些 select 标签并向它们添加选项。但是当我 运行 我的测试时,它显示这些 getElementById
.
为空
现在,如果我注释掉 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);
[...]
})
})
导致问题的原因是什么?是不是因为 document.getElementById
我的测试环境中不存在文档对象,因为我使用的是 'fake',如果是,我应该如何测试它?
下面是我为 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) => { /* Do something with element like this.element = element to save it */ }}
。这将使用已安装的 DOM 元素获得正确的回调,而无需引用文档。
应尽可能避免在 React 代码中使用 document,因为它无法进行通用渲染。
我正在使用 mocha 和 JsDom 来测试我的 React 组件。
首先我的组件工作完美,所以它是测试环境的问题。
情况:
我有一个组件可以呈现几个带有 id 的 select
标签。然后组件中的 componentDidMount
将使用 document.getElementById
获取那些 select 标签并向它们添加选项。但是当我 运行 我的测试时,它显示这些 getElementById
.
现在,如果我注释掉 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);
[...]
})
})
导致问题的原因是什么?是不是因为 document.getElementById
我的测试环境中不存在文档对象,因为我使用的是 'fake',如果是,我应该如何测试它?
下面是我为 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) => { /* Do something with element like this.element = element to save it */ }}
。这将使用已安装的 DOM 元素获得正确的回调,而无需引用文档。
应尽可能避免在 React 代码中使用 document,因为它无法进行通用渲染。