jeudi 20 février 2020

Test react redux render return undefined component

I have this a error when I do my test:

const rendered = render

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.

I have to test a list of events this list is in the store of redux and use useSelector to charge the list. this is my test:

import React from 'react';
import EventsList from './EventsList';
import { Provider } from 'react-redux';
import configureStore from 'redux-mock-store';
import { render, cleanup, fireEvent } from 'react-native-testing-library';
import { BrowserRouter } from 'react-router-dom';
import IEvent from './../../services/events/models/IEvent';
import { configure } from '@testing-library/react';

jest.mock('react-redux', () => ({ useSelector: jest.fn(fn => fn()) }));
afterEach(cleanup);

describe('<EventList />', () => {
  const mockStore = configureStore([]);
  const events: Array<IEvent> = [
    {
      id: '01',
      title: 'test',
      booking: true,
      description: 'description 1',
      venue: 'venue 1',
    },
    {
      id: '02',
      title: 'test',
      booking: true,
      description: 'description 2',
      venue: 'venue 2',
    },
  ];
  it('should display current list of events', () => {
    const store = mockStore({ type: 'FETCH_EVENTS_SUCCESS', data: events });
    const rendered = render(
      <Provider store={store}>
        <BrowserRouter>
          <EventsList />
        </BrowserRouter>
      </Provider>
    );
    const textComponent = rendered.getByTestId('CardContent');

    expect(textComponent.props.children).toContain(2);
  });
});

my component that I'm testing:

import React, { useEffect } from 'react';
import { useHistory } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { Grid, Container } from '@material-ui/core';

import EventCard from '../../components/EventCard';
import { eventListLoad } from './../../redux/module/events';
import IEvent from './../../services/events/models/IEvent';
import Loading from './../../components/Loading';
import Error from './../../components/Error';

interface IProps {
  events: Array<IEvent>;
}

const EventList = () => {
  const history = useHistory();
  const dispatch = useDispatch();
  let events = useSelector((state: any) => {
    return {
      data: state.events.data,
      loading: state.events.loading,
      error: state.events.error,
    };
  });
  useEffect(() => {
    dispatch(eventListLoad());
  }, [dispatch]);
  if (events === undefined || events.data === undefined) {
    events = {
      data: [],
      loading: false,
      error: false,
    };
  }
  return (
    <>
      {events.error !== '' ? (
        <Error title="Error" subtitle="no events found" />
      ) : events.loading ? (
        <Loading />
      ) : (
        <>
          <Container maxWidth="lg">
            <Grid container spacing={5}>
              {events.data.map((event: IEvent) => (
                <Grid item xs={12} sm={6} md={4} key={event.id}>
                  <EventCard
                    event={event}
                    onActionClick={() =>
                      history.push('event/detail/' + event.id)
                    }
                  />
                </Grid>
              ))}
            </Grid>
          </Container>
        </>
      )}
    </>
  );
};

export default EventList;

Aucun commentaire:

Enregistrer un commentaire