我有一个类似的组件:
<Parent>
<Child/>
</Parent>
和<Child/>
组件有一个方法foo
。我想测试foo
方法,但我不知道如何访问它。我试过了:
mount(<Parent><Child/></Parent>).props().children.foo
或
mount(<Parent><Child/></Parent>).children().foo
但他们都是undefined
。我不能使用.instance()
,因为它不是root。我无法挂载<Child/>
只是因为<Parent>
在context.router
上添加了一些内容(react-router的context
),而我在初始<Child/>
时需要它们。对此有什么想法?
答案 0 :(得分:3)
我会考虑只为你的父类编写测试,然后再测试一个单独的测试文件来测试你的孩子。
使用以下方法装载组件后
const component = mount(<Child>);
然后您可以使用以下方法访问它:
component.instance().methodname
然后您可以使用jest.fn()覆盖它并进行适当的测试。
答案 1 :(得分:3)
我更喜欢浅层安装而不是完全装载酶。
与proxyquire一起解决子组件(您要测试) 我做了
wrapper.find('Child1').props().propName
并测试它。
或者我使用浅
mount wrapper.dive()
答案 2 :(得分:2)
我认为您的问题与如何测试子组件有所不同。
我的第一个问题是:为什么要检查子组件在父组件测试中是否有特定的方法?
恕我直言,您需要针对此组件进行特定测试,然后在此测试中检查该方法是否存在。
为了不在没有答案的情况下离开,您是否尝试过.find(Child).instance().foo
?
答案 3 :(得分:1)
这对我有用:
mount(<Parent><Child/></Parent>).find(Child).instance().foo
答案 4 :(得分:0)
当我试图在MemoryRouter中的内部组件上模拟一个函数时,我遇到了类似的问题:
cont wrapper = mount(<MemoryRouter><AvailabilityButtonWithRouter.WrappedComponent vetId={ vetId } appointment={ availability } /></MemoryRouter>);
我最终能够像这样模拟这个函数:
const mockFn = jest.fn();
wrapper.children(0).children(0).instance().reloadCurrentPage = mockFn;
答案 5 :(得分:0)
我能够获得如下子函数的句柄,我一直在寻找第一个子函数-
const component = shallow(<Component />);
component.find(Child).first().getNode().props.someChildFunction()
答案 6 :(得分:0)
我遇到了类似的问题,并且通过登录使用了mount
API。在我的用例中,我的子组件(CommonStoresReactions)用mobx inject
包装。
const jsx = (
<Provider {...stores}>
<CommonStoresReactions>
<div />
</CommonStoresReactions>
</Provider>
)
const wrapper = mount(jsx)
我想测试clearStores
中的CommonStoresReactions
方法。下面的代码段对我有用。
wrapper
.find(CommonStoresReactions)
.instance()
.wrappedInstance.clearStores()
答案 7 :(得分:0)
酶有一个名为mount
(和wrappingComponent
)的wrappingComponentProps
API选项,可以将已安装的对象包装在另一个提供上下文的组件中。
请参见https://github.com/airbnb/enzyme/blob/master/docs/api/mount.md#mountnode-options--reactwrapper
答案 8 :(得分:0)
我设法使用dive
解决了这个问题wrapper.dive().props().propName
答案 9 :(得分:0)
含酶:
mount(<Parent><Child/></Parent>).childAt(0).instance().foo
有充分的理由访问孩子并调用方法。如果父级是肤浅的并且子级具有一致的接口,则可以在不知道它是哪个子级的情况下调用方法,测试所有子级都具有正确的接口,签名等。
答案 10 :(得分:0)
我发现的最好方法是使用浅层包装器的 dive
方法。这是文档:enzyme dive doc
请记住,如果您的父组件使用像 mount
这样的完全渲染,那么 react 包装器本身没有潜水方法,因此您必须使用浅渲染。
这是一个例子:
let instance, child, diveChild;
describe('Test Parent child Child component', () => {
beforeEach(() => {
wrapper = shallow(<Parent {...props} />);
child = wrapper.find('Child');
diveChild = child.dive();
console.log(diveChild.instance());
});
test('Child get mounted', () => {
expect(child.exists()).toBeTruthy();
expect(child.debug()).toMatchSnapshot();
});
});