0

I am trying to test the function searchTrigger in my CardMain component.

export default class CardMain extends Component {

    state = {
        Pools : [],
        loading: false,
    }

    componentDidMount(){
        axios.get('/pools')
        .then (res => {
                //console.log(res.data.data);
                this.setState({
                    Pools: res.data.data,
                    loading: true,
                    message: "Loading..."
                },()=>{
                    if (res && isMounted){
                        this.setState({
                            loading: false
                        });
                    }
                })
            }
        )
        .catch(err=>{
            console.log(err.message);
        })
    }

    


    // the function is for search method
    // upon search, this function is called and the state of the pools is changed
    searchTrigger = (search) => {

        Search = search.toLowerCase();

        SearchList = this.state.Pools.filter((e)=> {
            if (e.name.toLowerCase().includes(Search)){
                this.setState({
                    loading: false
                })
                return e
            } 
        })

        if (SearchList.length === 0){
            this.setState({
                loading: true,
                message: "No pools found"
            })
        }
    }


    render() {
        return (
            <div>
                <Searchbar trigger={this.searchTrigger}/>
                { this.state.loading ?
                 <div className="d-flex justify-content-center">{this.state.message}</div>   
                :<div>
                   {Search === "" ? <Card1 pools={this.state.Pools}/> : <Card1 pools={SearchList}/> }
                </div>
                }
            </div>
        )
    }
}

The function searchTrigger is passed to another class component called Searchbar which basically displays the search bar. Upon searching something, the function searchTrigger is called and the searched value is passed as an argument to this function.

So, I am trying to test this function and I am new to react and testing. I found some examples online and tried a simple testing whether the function is called or not. My CardMain.test.js code looks like this:

describe("callback function test", ()=> {
    it("runs it", () => {
        //const spy = jest.spyOn(CardMain.prototype,"searchTrigger");
        const cardmain = shallow(<CardMain/>)
        const spy = jest.spyOn(cardmain.instance(), "searchTrigger");
        expect(spy).toHaveBeenCalled()
    })
});

I get the TypeError: Cannot read property 'get' of undefined pointing to the axios.get("/pools") in the CardMain component inside componentDidMount. axios is being imported from another component api.js which creates the instance of axios using axios.create. I have no idea what the problem is. I am very new to react. I have absolutely no idea, how do I test these components? Could somebody help me?

Update:

So, i tried mocking axios call:
let Wrapper;
beforeEach(() => {
    Wrapper = shallow( <CardMain/>);
  });


describe("Card Main", ()=> {
    it("returns data when called", done => {
        let mock = new MockAdapter(axios);
        const data = [{
            name: "Test",
            response: true
        }];
        mock.onGet('My_URL')
        .reply(200,data);
        const instance = Wrapper.instance();
        instance.componentDidMount().then(response => {
            expect(response).toEqual(data);
            done();
        });
    });
});

It says "cannot read property .then of undefined"

user381120
  • 25
  • 7
  • 1
    You have to mock the `axios`. [check here](https://stackoverflow.com/questions/45016033/how-do-i-test-axios-in-jest) – Sarun UK Nov 19 '20 at 11:25
  • 1
    I tried mocking axios following the link. it says cannot read property .then of undefined. Updated axios test to the question above. Cannot i just test the function directly passing some values without mocking axios? – user381120 Nov 19 '20 at 13:56
  • ok.. try this also - ` import axios from 'axios'; jest.mock('axios'); axios.get.mockResolvedValue(mockedData);` – Sarun UK Nov 19 '20 at 14:20
  • `mockData` is nothing but your response – Sarun UK Nov 19 '20 at 14:23

0 Answers0