Testing a component after state has been updated in componentDidMount using enzyme jest react-native -


i have component in react-native

export default class searchresultsscreen extends component {    constructor(props){       super(props);       this.state = {         centres: [],       };   };     componentdidmount() {         let searchurl =`${hostname}centres_search/`;         let lat = this.props.origin_lat;         let long = this.props.origin_long;         let distance = this.props.distance;         let url = `${searchurl}origin_lat=${lat}&origin_long=${long}&distance=${distance}`         console.log('before fetch called');         fetch(url)           .then((response) => response.json())           .then((responsejson) => {              console.log('before state updated '+responsejson[0].name);              this.setstate({               centres: responsejson,              });              console.log('after fetch called '+responsejson[0].name);           })           .catch((error)=>{              console.log('error '+error);              this.setstate({                centres: [],              });           });    }     static navigationoptions = {       title: 'centers',       headertitlestyle: navigationheaderstyle    };     render() {       let centreslist;       if(typeof this.state.centres == 'undefined' ||           this.state.centres.length == 0) {           centreslist = <text>no results found</text>       } else {          centreslist = <flatlist              data={this.state.centres}              keyextractor={(item, index) => item._centre_id}              renderitem={({item}) => <centrecomponent centre={item}/>}              itemseparatorcomponent={() => <listseperator />}           />       }      return(        <view>           {centreslist}           <listseperator />        </view>     );    }; } 

so loads centrecomponent(s) based on response fetch (i.e number of results gets).

in test jest trying assert 2 components of type centrecomponent exist. test looks this:

jest.disableautomock(); import 'react-native'; import react 'react'; import {shallow, mount, render} 'enzyme'; import searchresultsscreen '../../src/searchresultsscreen/index'; import centrecomponent      '../../src/searchresultsscreen/centrecomponent'; import renderer 'react-test-renderer';  describe('searchresultsscreen', () => {   test.only('renders more 1 centrecomponent', () => {     jest.usefaketimers();     global.fetch = jest.fn().mockimplementation(() => {         let kc = [{           _centre_id: 1,           name: 'test',           address_1: 'abc',           address_2: 'def',           city: 'so',           postcode: 'tt',         }, {           _centre_id: 2,           name: 'testee',           address_1: 'abc',           address_2: 'def',           city: 'so',           postcode: 'tt',         }]         console.log('mock fetch called');          return new promise((resolve, reject) => {           process.nexttick(             () => resolve({ok: true, json: function(){return kc}})           );         });      });       const checkbox = mount(<searchresultsscreen origin_long='5' origin_lat='2' distance='5'/>);      jest.runallticks();      checkbox.update();      expect(checkbox.find(karcentrecomponent)).tohavelength(2);    }); }); 

when run test jest.js --env=jsdom

i see following console.log being printed in order:

console.log('before fetch called'); console.log('mock fetch called'); console.log('before state updated '+responsejson[0].name);  error @ line: console.log('error '+error); 

the error is:

  { invariant violation: element type invalid: expected string (for    built-in components) or class/function (for composite components)    got: undefined. forgot export component    file it's defined in. check render method of    `searchresultsscreen` 

so suspicion that, when componentdidupdate calling

  this.setstate({           centres: responsejson,          }); 

it throwing exception being caught "catch".


Comments

Popular posts from this blog

python - Selenium remoteWebDriver (& SauceLabs) Firefox moseMoveTo action exception -

html - How to custom Bootstrap grid height? -

angular - Copying node modules to wwwroot AspNetCore -