beforeEach не выполняется в шутку - PullRequest
0 голосов
/ 08 января 2020
describe('DropDown', () => {
  let store: any;
  let wrapper: any;

  beforeEach(() => {
    store = mockStore({
      dropDown: {
        ...
      },
    });
    wrapper = mount(
      <Provider store={store}>
        <DropDown />
      </Provider>
    );
  });

  it('Search should update the list', () => {
    const searchField = wrapper.find('.textInput');
    searchField.simulate('change', {
      target: {
        value: 'First customer',
      },
    });
    expect(wrapper.find('.customersList .list li').length).toBe(1);
  });
})

и я получаю элемент Cannot read property 'find' of undefined на wrapper в блоке it. Почему? Если я обновлю let wrapper: any = null, он переключится на cannot read property on null, поэтому блок beforeEach не будет вызываться. Кто-нибудь знает почему?

РЕДАКТИРОВАТЬ: Мне понравился @ co linux ответ, поэтому я принял его, но моя настоящая причина состояла в том, что объект store dropDown был переименован и для по какой-то причине он сломал вещи, которые не имели к этому никакого отношения.

1 Ответ

1 голос
/ 08 января 2020

Из-за способа, которым Jest выполняет тесты (из-за насмешек и параллелизма среди прочих), небезопасно назначать внешние переменные в beforeEach и друзьях.

Вместо этого для такого типа шаблона лучше определить общий метод и вызывать его вручную в каждом тесте.

describe('DropDown', () => {
  function prepare() {
    const store = mockStore({
      dropDown: {},
    });

    const wrapper = mount(
      <Provider store={store}>
        <DropDown />
      </Provider>,
    );

    return { store, wrapper };
  }

  it('Search should update the list', () => {
    const { wrapper } = prepare();

    const searchField = wrapper.find('.textInput');
    searchField.simulate('change', {
      target: {
        value: 'First customer',
      },
    });

    expect(wrapper.find('.customersList .list li').length).toBe(1);
  });
});

Метод prepare возвращает переменные, используемые в тестах. Каждый тест может получить то, что ему нужно. Вы также можете улучшить метод с помощью дополнительных параметров, если, скажем, для теста вам нужно создать немного другое хранилище.

РЕДАКТИРОВАТЬ: этот шаблон подробно описан здесь с библиотекой тестирования https://kentcdodds.com/blog/avoid-nesting-when-youre-testing

...