当前位置: 首页 > 面试题库 >

开玩笑+酶,使用mount(),document.getElementById()在_method调用后出现的组件上返回null

吴升
2023-03-14
问题内容

我的笑话+酶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之神找到了解决方案:

  1. 通过attachToparam将我的组件附加到DOM :
        const result = mount(
        <App />, { attachTo: document.body }
    );
  1. 将我的方法中的越野车字符串更改为与元素Object一起使用的字符串
    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应该已经为您完成了该测试。 与您的测试更相关的是测试您要在组件中使用该方法的功能或动作。 如果要进行一些

  • 我有以下组成部分: 现在我正在尝试编写一个单元测试来检查if条件(根据.to属性返回IndexLink或Link): 但我似乎无法测试函数的确切jsx返回,因为当我使用控制台时。记录我得到的其中一个返回: {$$typeof':Symbol(react.element),type:'div',key:'/',ref:null,props:{className:'navbar link contai