【发布时间】:2017-06-07 04:05:36
【问题描述】:
我正在尝试为需要在其componentWillMount 方法中完成异步操作的 React 组件编写测试。 componentWillMount 调用一个函数,作为道具传递,它返回一个承诺,我在测试中模拟了这个函数。
这可以正常工作,但如果在调用 setImmediate 或 process.nextTick 时测试失败,则 Jest 不会处理该异常并提前退出。下面,你可以看到我什至试图捕捉这个异常,但无济于事。
如何在 Jest 中使用 setImmediate 或 nextTick 之类的内容?这个问题的公认答案是我试图实现的失败:React Enzyme - Test `componentDidMount` Async Call。
it('should render with container class after getting payload', (done) => {
let resolveGetPayload;
let getPayload = function() {
return new Promise(function (resolve, reject) {
resolveGetPayload = resolve;
});
}
const enzymeWrapper = mount(<MyComponent getPayload={getPayload} />);
resolveGetPayload({
fullname: 'Alex Paterson'
});
try {
// setImmediate(() => {
process.nextTick(() => {
expect(enzymeWrapper.hasClass('container')).not.toBe(true); // Should and does fail
done();
});
} catch (e) {
console.log(e); // Never makes it here
done(e);
}
});
Jest v18.1.0
节点 v6.9.1
【问题讨论】:
-
您是否阅读过有关测试异步内容的文档 (facebook.github.io/jest/docs/tutorial-async.html#content)?
-
是的,我不是在测试异步函数,而是在测试一个需要等待承诺的组件。
-
但是你创建了一个promise,即使你在测试中解决了它也不会在测试运行中产生影响,你至少需要从测试中返回promise。
-
但是你创建了一个promise,即使你在测试中解决了它也不会在测试运行中产生影响,你至少需要从测试中返回promise。
-
您是否设法解决了这个问题@AlexPaterson?我遇到了同样的问题,唯一可行的方法是将期望包装到 try catch 中……对我的口味来说有点难看。这也可能是相关的; github.com/facebook/jest/issues/2059
标签: node.js reactjs jasmine jestjs