javascript - React 单元测试 onClick 方法中的 Mock Fetch API

标签 javascript unit-testing reactjs mocking fetch-api

我为我要测试的代码创建了一个 JS Bin:https://jsbin.com/zaqiyuw/edit?html,js,output 。我有一个调用组件中方法的按钮。该组件使用 fetch 调用 api,然后根据返回的内容设置 State。我似乎无法正确地 mock 它。

当测试运行时,它调用该方法并将 getPingMsg() 中的状态设置为 { ping: "loading..."} 但它从未将其设置为从测试中的 then on fetch 获取的值。有什么想法可能是什么问题吗?

我正在使用sinon、 enzyme 和jest。这是我尝试过的:

describe('<App />', function() {

    const wrapper = shallow(<App />);

    it('should return 1 onClick', ()=> {
        sinon.stub(window, 'fetch');
        function jsonOk (body) {
            const mockResponse = 
                new window.Response(JSON.stringify(body), {
                    status: 200,
                    headers: {
                         'Content-type': 'application/json'
                    }
                 });
             return Promise.resolve(mockResponse);
         }
         window.fetch.returns(
             jsonOk({ping: 1})
         );
         wrapper.update();
         expect(wrapper.state()).toEqual({ ping: 'No Request Yet' }); //this works
         wrapper.find('button').simulate('click');
         expect(wrapper.state()).toEqual({ ping: 1 }); //this doesn't
     });
});

最佳答案

非常感谢。事实证明,它正在设置状态,但在我调用期望语句(DOH)之后!在您的帮助下,此测试有效:

it('should return pong onClick', (done)=> {
    sinon.stub(window, 'fetch');
    function jsonOk (body) {
        const mockResponse = new window.Response(JSON.stringify(body));
        return Promise.resolve(mockResponse);
    }
    window.fetch.returns((jsonOk({ping: 1})));
    expect(wrapper.state()).toEqual({ ping: 'No Request Yet' });
    wrapper.find('button').simulate('click');
    setTimeout(function() {expect(wrapper.state()).toEqual({ ping: 1 }); console.log(wrapper.state()); done();}, 10);
});

关于javascript - React 单元测试 onClick 方法中的 Mock Fetch API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43484337/

相关文章:

reactjs - 无法使用 "create-react-native-app"创建新应用程序

javascript - Regexp (?<=string) 给出无效组错误?

javascript - 如何在 Ajax 中实现相同的行为

javascript - 使用 three.js 加载 OBJMTL 对象并获取 Mesh 的几何参数

python - 如何测试在模拟时是否使用 "self"调用实例的方法?

javascript - 设置 Jest 测试

javascript - 收缩时带有图标装饰的 Material-UI 文本字段的标签位置 false

JavaScript .split 函数不适用于所有浏览器

python - 如何在 Flask 中伪造 request.POST 和 GET 参数以进行单元测试?

reactjs - 浏览器窗口中的 Electron 高度不会传播