【发布时间】:2017-06-28 21:52:02
【问题描述】:
我有一个包含以下组件的最小测试反应应用程序:
import React from 'react';
import $ from 'jquery';
export default class App extends React.Component {
componentDidMount() {
console.log('componentDidMount', $('#helloDiv').length);
}
render() {
return <div id='helloDiv'>
Hello React!
</div>;
}
}
在浏览器 (Chrome) 中加载它时效果很好。 componentDidMount() 中的 console.log() 打印出 1 helloDiv element found
但是,如果我使用 mocha + 酶 + jsdom 运行测试,App 组件中的相同 console.log() 会打印出 0:
import React from 'react';
import { mount } from 'enzyme';
import { expect } from 'chai';
import App from '../src/client/app/first'
describe('first test', () => {
it('should pass', () => {
const app = mount(<App />);
expect(app.find('#helloDiv').length).to.eq(1);
});
});
注意:我对这个单元测试没有问题,它通过了。真正的问题是,当 使用酶安装时,componentDidMount() 被调用,但其中的 console.log() 语句打印出 0,而不是 1
这是我运行 mocha 的方式:
mocha --require enzyme/withDom --compilers js:babel-core/register test/index.test.js
知道为什么 jquery 选择器在测试中没有找到任何东西吗?这不应该是 mocha 的问题,因为如果我改成 jest 也会出现同样的问题
【问题讨论】:
-
考虑在 Node.Js 应用程序中使用
cheerio而不是 jQuery。 -
@Mijago 感谢您的建议。但是就我而言,我没有太多选择,至少目前是这样。这是我正在处理的当前项目的简化版本,jquery 已在整个项目中使用
-
也许
app.find('#helloDiv')搜索应用inside,但应用本身有id?您的 jQuery 版本搜索整个文档。 -
@Prinzhorn 抱歉,我认为我的测试有点误导。我对期望本身没有问题。问题是在挂载
组件时,调用了 componentDidMount(),但其中的 console.log() 打印出 0。我将更新问题以澄清这一点 -
我想答案仍然适用。该组件实际上并未安装在任何 jQuery 可以找到它的文档中。它只存在于 ReactWrapper 酶内部?
标签: javascript jquery reactjs enzyme jsdom