Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未运行Jest+酶API模拟调用测试_Javascript_Reactjs_Jestjs_Enzyme - Fatal编程技术网

Javascript 未运行Jest+酶API模拟调用测试

Javascript 未运行Jest+酶API模拟调用测试,javascript,reactjs,jestjs,enzyme,Javascript,Reactjs,Jestjs,Enzyme,我有一个我无法理解的问题,我希望有人能帮我解决 这是我的测试:state.messages是一个空数组,而api.botReply在要运行的函数中被调用0次 state.typing设置为true,因此我知道我运行了该函数 test('test to resolve data from botReply', done => { const wrapper = shallow(<Bot />); api.botReply = jest.fn(() =>

我有一个我无法理解的问题,我希望有人能帮我解决

这是我的测试:state.messages是一个空数组,而api.botReply在要运行的函数中被调用0次

state.typing设置为true,因此我知道我运行了该函数

test('test to resolve data from botReply', done => {
    const wrapper = shallow(<Bot />);

    api.botReply = jest.fn(() =>
        Promise.resolve(wrapper.setState({ typing: false }))
    );

    wrapper.instance().sendReply();

    setImmediate(() => {
        wrapper.update();
        console.log(wrapper.state('typing'));
        console.log(wrapper.state('messages'));
        expect(api.botReply).toHaveBeenCalledTimes(1);
        done();
    });
});

丢弃承诺链和使用随机延迟会导致类似这样的竞争条件

因为在测试中提供了承诺,所以应该将其链接起来以保持正确的控制流。这不是一个好的做法,指定玩笑间谍作为方法,因为他们不会被清理后。承诺应该通过回复来解决,而不是设定状态

应该是这样的:

test('test to resolve data from botReply', async () => {
    const wrapper = shallow(<Bot />);
    const promise = Promise.resolve('reply')'

    jest.spyOn(api, 'botReply').mockImplementation(() => promise);

    wrapper.instance().sendReply();
    expect(wrapper.state('typing')).toBe(true);
    await promise;
    expect(api.botReply).toHaveBeenCalledTimes(1);
    expect(wrapper.state('typing')).toBe(false);
});

你想用setImmediate做什么?我试图确保数据已被解析,这是我在谷歌上找到的解决方案,但可能是完全错误的。我不知道这里的答案,但我认为放弃这个非标准、不受良好支持的函数可能是一个好的开始。谢谢你的回复,我觉得这是一件更容易理解的事情,唯一的一件事我不知道在哪里调用我的setState,因为tobevalse将失败,因为现在你不需要在任何地方调用setState。您正在测试的sendReply中已经调用了它。您可以尝试在expectwrapper.state'typing'.toBefalse之前添加wrapper.update,尽管这不是必需的。您可以看到它按原样工作,它也没有帮助,状态仍然是{typing:true,messages:[]}确保您使用的是最新的酶版本。答案包含可行的解决方案。正如您在演示中看到的,它按预期工作。这是针对你的情况的。考虑提供一种方法来复制这个问题。所有的事情都是最新的,但有一些睡眠,我得到它使用你的代码工作,谢谢你的帮助!
test('test to resolve data from botReply', async () => {
    const wrapper = shallow(<Bot />);
    const promise = Promise.resolve('reply')'

    jest.spyOn(api, 'botReply').mockImplementation(() => promise);

    wrapper.instance().sendReply();
    expect(wrapper.state('typing')).toBe(true);
    await promise;
    expect(api.botReply).toHaveBeenCalledTimes(1);
    expect(wrapper.state('typing')).toBe(false);
});