编辑:解决了!向下滚动查看答案
在我们的组件测试中,我们需要它们访问react-intl
上下文。问题是我们在mount()
没有<IntlProvider />
父包装器的情况下安装单个组件(使用 Enzyme 的)。这是通过将提供者包裹起来解决的,然后root
指向IntlProvider
实例而不是指向CustomComponent
.
该测试与阵营-国际:酶文档仍然是空的。
<自定义组件/>
class CustomComponent extends Component {
state = {
foo: 'bar'
}
render() {
return (
<div>
<FormattedMessage id="world.hello" defaultMessage="Hello World!" />
</div>
);
}
}
标准测试用例(所需)(酶+摩卡+柴)
// This is how we mount components normally with Enzyme
const wrapper = mount(
<CustomComponent
params={params}
/>
);
expect( wrapper.state('foo') ).to.equal('bar');
但是,由于我们的组件FormattedMessage
用作react-intl
库的一部分,因此在运行上述代码时会出现此错误:
Uncaught Invariant Violation: [React Intl] Could not find required `intl` object. <IntlProvider> needs to exist in the component ancestry.
用它包裹 IntlProvider
const wrapper = mount(
<IntlProvider locale="en">
<CustomComponent
params={params}
/>
</IntlProvider>
);
这提供CustomComponent
了intl
它要求的上下文。但是,在尝试进行诸如此类的测试断言时:
expect( wrapper.state('foo') ).to.equal('bar');
引发以下异常:
AssertionError: expected undefined to equal ''
这当然是因为它试图读取状态IntlProvider
而不是我们的CustomComponent
.
尝试访问 CustomComponent
我已经尝试了以下无济于事:
const wrapper = mount(
<IntlProvider locale="en">
<CustomComponent
params={params}
/>
</IntlProvider>
);
// Below cases have all individually been tried to call `.state('foo')` on:
// expect( component.state('foo') ).to.equal('bar');
const component = wrapper.childAt(0);
> Error: ReactWrapper::state() can only be called on the root
const component = wrapper.children();
> Error: ReactWrapper::state() can only be called on the root
const component = wrapper.children();
component.root = component;
> TypeError: Cannot read property 'getInstance' of null
现在的问题是:我们如何才能安装CustomComponent
使用intl
方面,同时仍然能够执行我们的“根”的操作CustomComponent
?