我的笑话+酶mount()
测试遇到问题。我正在测试一个功能,该功能可以切换显示组件。
组件之间的开关:当state.infoDisplayContent = 'mission'
一个missionControl
部件被安装时,当state.infoDisplayContent = 'profile'
-其它组分的步骤中:
_modifyAgentStatus () {
const { currentAgentProfile, agentsDatabase } = this.state;
const agentToMod = currentAgentProfile;
if (agentToMod.status === 'Free') {
this.setState({
infoDisplayContent: 'mission'
});
agentToMod.status = 'Waiting';
} else if (agentToMod.status === 'Waiting') {
const locationSelect = document.getElementById('missionLocationSelect');
agentToMod.location = locationSelect[locationSelect.selectedIndex].innerText;
agentToMod.status = 'On Mission';
this.setState({
infoDisplayContent: 'profile'
});
}
}
当我触发此函数时,一切看起来都很好,该测试运行良好,并且测试成功通过了所需的组件:
import React from 'react';
import { mount } from 'enzyme';
import App from '../containers/App';
const result = mount(
<App />
)
test('change mission controls', () => {
expect(result.state().currentAgentProfile.status).toBe('Free');
result.find('#statusController').simulate('click');
expect(result.find('#missionControls')).toHaveLength(1);
expect(result.find('#missionLocationSelect')).toHaveLength(1);
expect(result.state().currentAgentProfile.status).toBe('Waiting');
});
But when I simulate onClick two times:
test('change mission controls', () => {
expect(result.state().currentAgentProfile.status).toBe('Free');
result.find('#statusController').simulate('click');
expect(result.find('#missionControls')).toHaveLength(1);
expect(result.find('#missionLocationSelect')).toHaveLength(1);
expect(result.state().currentAgentProfile.status).toBe('Waiting');
result.find('#statusController').simulate('click');
expect(result.state().currentAgentProfile.status).toBe('On Mission');
});
我得到这个断言:
TypeError: Cannot read property 'selectedIndex' of null
at App._modifyAgentStatus (development/containers/App/index.js:251:68)
at Object.invokeGuardedCallback [as invokeGuardedCallbackWithCatch] (node_modules/react-dom/lib/ReactErrorUtils.js:26:5)
at executeDispatch (node_modules/react-dom/lib/EventPluginUtils.js:83:21)
at Object.executeDispatchesInOrder (node_modules/react-dom/lib/EventPluginUtils.js:108:5)
at executeDispatchesAndRelease (node_modules/react-dom/lib/EventPluginHub.js:43:22)
at executeDispatchesAndReleaseSimulated (node_modules/react-dom/lib/EventPluginHub.js:51:10)
at forEachAccumulated (node_modules/react-dom/lib/forEachAccumulated.js:26:8)
at Object.processEventQueue (node_modules/react-dom/lib/EventPluginHub.js:255:7)
at node_modules/react-dom/lib/ReactTestUtils.js:350:22
at ReactDefaultBatchingStrategyTransaction.perform (node_modules/react-dom/lib/Transaction.js:140:20)
at Object.batchedUpdates (node_modules/react-dom/lib/ReactDefaultBatchingStrategy.js:62:26)
at Object.batchedUpdates (node_modules/react-dom/lib/ReactUpdates.js:97:27)
at node_modules/react-dom/lib/ReactTestUtils.js:348:18
at ReactWrapper.<anonymous> (node_modules/enzyme/build/ReactWrapper.js:776:11)
at ReactWrapper.single (node_modules/enzyme/build/ReactWrapper.js:1421:25)
at ReactWrapper.simulate (node_modules/enzyme/build/ReactWrapper.js:769:14)
at Object.<anonymous> (development/tests/AgentProfile.test.js:26:38)
at process._tickCallback (internal/process/next_tick.js:109:7)
显而易见的是:
document.getElementById('missionLocationSelect');
返回null,但我无法理解为什么。正如我提到的那样,元素通过了测试。
expect(result.find('#missionLocationSelect')).toHaveLength(1);
但无法使用捕获document.getElementById()
。
请帮助我解决此问题并运行测试。
通过hung和Google之神找到了解决方案:
attachTo
param将我的组件附加到DOM : const result = mount(
<App />, { attachTo: document.body }
);
agentToMod.location = locationSelect.options[locationSelect.selectedIndex].text;` :
_modifyAgentStatus () {
const { currentAgentProfile, agentsDatabase } = this.state;
const agentToMod = currentAgentProfile;
if (agentToMod.status === 'Free') {
this.setState({
infoDisplayContent: 'mission'
});
agentToMod.status = 'Waiting';
} else if (agentToMod.status === 'Waiting') {
const locationSelect = document.getElementById('missionLocationSelect');
agentToMod.location = agentToMod.location = locationSelect.options[locationSelect.selectedIndex].text;
agentToMod.status = 'On Mission';
this.setState({
infoDisplayContent: 'profile'
});
}
}
问题内容: 我有一个React组件(为了演示该问题,对此进行了简化): 现在,我要测试提供的值的调用。 为此,我想创建一个代替组件方法的笑话模拟函数。 到目前为止,这是我的测试用例: 但是我在控制台中得到的只是: 语法错误 所以我的问题是,如何正确地用酶模拟组分方法? 问题答案: 可以通过以下方式模拟该方法: 您还需要在被测组件的包装器上调用.update,以便正确注册模拟功能。 语法错误来自错误
问题内容: 我是开玩笑/酶的新手,正尝试模拟对返回Promise的aync函数的调用,该调用是在componentDidMount方法的react组件内进行的。 该测试正在尝试测试componentDidMount将Promise返回的数组设置为状态。 我遇到的问题是,在将数组添加到状态之前,测试已完成并通过。我正在尝试使用“完成”回调来使测试等待,直到承诺解决为止,但这似乎不起作用。 我尝试将E
问题内容: Jest提供了一种模拟函数的方法,如其文档中所述 但是,这些模拟仅在直接在测试中调用函数时才起作用。 如果我有一个这样定义的React Component,该如何模拟呢? 我不知道如何制作它,所以组件调用了我的模拟实现,以便我可以测试它是否可以正确地呈现数据。 (这是一个简化的,人为的示例,目的是为了了解如何模拟在React组件内部调用的函数) 编辑:api.js文件,为清楚起见 问题
问题内容: 我正在尝试测试是否调用componentWillMount,为此我的测试是 但是,即使调用componentWillMount方法,测试也不会通过。我在这里想念什么? 问题答案: 我不知道其他答案是否对您的问题有所帮助,但是您不需要测试componentWillMount。React应该已经为您完成了该测试。 与您的测试更相关的是测试您要在组件中使用该方法的功能或动作。 如果要进行一些
null
我有以下组成部分: 现在我正在尝试编写一个单元测试来检查if条件(根据.to属性返回IndexLink或Link): 但我似乎无法测试函数的确切jsx返回,因为当我使用控制台时。记录我得到的其中一个返回: {$$typeof':Symbol(react.element),type:'div',key:'/',ref:null,props:{className:'navbar link contai