Enzyme onclick spy toHaveBeenCalled test does not work when testing on arrow function

后端 未结 1 534
傲寒
傲寒 2021-01-25 04:56

how can i test the child component onclick.

Please see the below snippet.

// App.js

import React, {Component, Fragment} from \'react\'
import Child from         


        
相关标签:
1条回答
  • 2021-01-25 05:25

    Some important points to consider.

    Asynchronous code in your tests

    If you have to do asynchronous tasks in your tests you always have to await until the asynchronous stuff is completed.

    setTimeout(() => {
       mountWrapper.update()
             const SpyhandleChildClick = jest.spyOn(mountWrapper.instance(),'_handleChildClick')
      mountWrapper.find('.toggle').simulate('click')
      expect(SpyhandleChildClick).toHaveBeenCalled() // not called 
    },0)
    

    Above in your code you have a timeout segment. Any test condition inside this code block will not be evaluated since by the time they are evaluated you 'test session' will already be over due to the aync nature.

    Testing arrow functions in React with enzyme - forceUpdate()

    There seem to be a problem with the enzyme library where you have to force update the react component after spying for it to latch on to the method. Please follow the github issue for more information : https://github.com/airbnb/enzyme/issues/365

    I also cleaned up your test code a bit to make it more understandable!

    // App.test.js
    
    import React from 'react';
    import {enzyme} from 'enzyme';
    import App from './App';
    
    
    describe("App test cases", () => {
      it("should trigger _handleChildClick", async () => {
        window.fetch = jest.fn().mockImplementation(() => ({
          status: 200,
          json: () =>
            new Promise((resolve, reject) => {
              resolve({
                name: "some data"
              });
            })
        }));
    
        const mountWrapper = mount(<App />);
        mountWrapper.update();
        console.log("mountWrapper", mountWrapper.debug()); // showing the loader one
    
        //[FIX]This code will block and wait for your asynchronous tasks to be completed
        await new Promise(res => setTimeout(() => res(), 0));
    
        mountWrapper.update();
        console.log("mountWrapper", mountWrapper.debug()); // nothing showing
        expect(mountWrapper.find(".toggle").length).toEqual(1);
    
        //[FIX]Get a reference from the wrapper and force update after the spyOn call
        const instance = mountWrapper.instance();
        const spy = jest.spyOn(instance, "_handleChildClick");
        instance.forceUpdate();
    
        mountWrapper.find(".toggle").simulate("click");
    
        expect(spy).toHaveBeenCalled();
      });
    });
    

    Live Demo Link: Click on the 'Tests' tab on the browser to see the test results https://codesandbox.io/s/mz21kpm37j

    0 讨论(0)
提交回复
热议问题