web-dev-qa-db-fra.com

Quel est le but de «beforeEach» global dans Jest?

Je trouve toujours les cas de test Jest-Enzyme commençant par un global beforeEach qui ressemble à ce qui suit:

describe('TEST BLOCK' () => {
  let wrapper;

  beforeEach(() => {
    wrapper = shallow(<Component />);
  ));
));

La fonction dans le global beforeEach s'exécute avant chaque test dans le TEST BLOCKdescribe bloc. Dans ce cas, il rend le Component et l'affecte à wrapper avant d'exécuter chaque test. Je ne sais pas très bien pourquoi faisons-nous cela en premier lieu. Ne ralentissons-nous pas délibérément la durée du test? N'est-il pas correct de le rendre une fois et de l'affecter à wrapper? Quel est le but du beforeEach ici? Y a-t-il d'autres scénarios où beforeEach est bénéfique lors du test des composants React?

6
user117829

Si vous avez du code commun à plusieurs tests, vous pouvez utiliser beforeEach pour effectuer une configuration avant l'exécution de chaque test afin d'éviter la répétition. Dans ce cas, si vous avez plusieurs tests qui montent peu profond Component, vous pouvez déplacer le montage peu profond vers beforeEach, et le composant sera monté lors de chaque test. En général, vous souhaiterez associer cela à un afterEach, où vous appelez wrapper.unmount().

describe('tests', () => {
  it('does one thing', () => {
    const wrapper = shallow(<Component />);
    // ...test some things
    wrapper.unmount();
  });

  it('does another thing', () => {
    const wrapper = shallow(<Component />);
    // ...test something else
    wrapper.unmount();
  });

  it('does a third thing', () => {
    const wrapper = shallow(<Component />);
    // ...test a third thing
    wrapper.unmount();
  });
});

devient:

describe('tests', () => {
  let wrapper;

  beforeEach(() => {
    wrapper = shallow(<Component />);
  });

  afterEach(() => {
    wrapper.unmount();
  });

  it('does something', () => {
    // ...test something
  });

  it('does something else', () => {
    // ...test something else
  });

  it('does another thing', () => {
    // ...test a third something
  });
});

beforeEach est appelée la phase de "configuration" et afterEach la phase de "démontage".

Ne ralentissons-nous pas délibérément le temps d'exécution du test?

Non, car vous devrez de toute façon monter le composant dans chaque test.

N'est-il pas acceptable de le rendre une fois et de l’affecter au wrapper?

La persistance d'un composant (ou de n'importe quel état) sur plusieurs tests peut provoquer des tests irréguliers, car (par exemple) vous pouvez obtenir un résultat différent si les tests sont exécutés dans un ordre différent. Tout état (tel qu'un composant monté) doit être configuré avant chaque test et détruit après chaque test. Cela rend vos tests complètement indépendants les uns des autres.

5
helloitsjoe

La documentation Jest recommande beforeEach pour les tests qui consomment un état global particulier pour chaque test, par exemple, la réinitialisation des données de test dans une base de données avant chaque test. exécutez .

Notez le cas suivant:

Si beforeEach se trouve dans un bloc de description, il s'exécute pour chaque test du bloc de description.

En utilisant le même exemple où nous avons une base de données avec des données de test, si vos tests n'ont pas besoin de réinitialiser les données de test pour chaque test, vous pouvez utiliser beforeAll pour exécuter du code une fois , avant l'exécution des tests.

0
Peter