Вложенное описание и поведение динамически создаваемых "it" - PullRequest
1 голос
/ 29 марта 2019

Я вложил describe s в свои тесты и, как обычно, я использую некоторые beforeEach и ранее в описании. И одна из моих describe функций вызывает вспомогательную функцию, которая создает динамические тесты (DRY). И мокко запускает описание вложенного описания перед beforeEach методом. И мой динамически созданный it имеет комп как undefined.

const checkProps = (comp, propName, expectedvalue) => {
   it(`${comp} should have ${propName} equal to ${expectedvalue}`, () => {
       expect(comp.prop(propName)).to.equal(expectedvalue);
   });
};

describe('Component', () => {
  let wrapper;
  beforeEach(() => {
    wrapper = shallow(<MyComponent />);
  });

   describe('prop checking', () => {
     checkProps(wrapper, 'title', 'SomeTitle');
   });
});

Какой лучший способ сделать это? Заранее спасибо.

1 Ответ

1 голос
/ 30 марта 2019

Что происходит

Цикл выполнения Mocha сначала запускает все функции обратного вызова describe (... что также верно для других платформ тестирования, таких каккак Jest и Jasmine).

Затем он запускает before перехватчики, затем beforeEach перехватчики и, наконец, it обратные вызовы.

Итак, checkProps запускаетсякак часть запуска начальных обратных вызовов describe, и в этот момент wrapper равен undefined, так что, как вы заметили, в описании теста написано undefined should have....

Хук beforeEach запускается доit функция обратного вызова выполняется ... но она переопределяет wrapper, поэтому, когда it обратный вызов запускается comp все еще undefined и тест не пройден:

  1) Component
       prop checking
         undefined should have title equal to SomeTitle:
     TypeError: Cannot read property 'prop' of undefined
      at Context.prop (test/code.test.js:15:19)

Решение

Необходимо изменить пару вещей:

  • Имя компонента должно быть доступно при запуске it и при этомточка wrapper еще не существует, поэтому вам придется самим передавать имя.
  • Если вы передаете объект в checkProps, тогда вы можете установить свойство wrapper в объекте.ct во время beforeEach и доступ к этому свойству wrapper в вашем тесте, поскольку объект никогда не переопределяется.

Вот рабочий тест, который должен приблизить вас к тому, что вы пытаетесь сделать:

import * as React from 'react';
import { shallow } from 'enzyme';

const MyComponent = () => (<div title="SomeTitle">some text</div>);

const checkProps = (name, obj, propName, expectedvalue) => {
  it(`${name} should have ${propName} equal to ${expectedvalue}`, () => {
    expect(obj.wrapper.prop(propName)).to.equal(expectedvalue);  // Success!
  });
};

describe('Component', () => {
  const obj = {};
  beforeEach(() => {
    obj.wrapper = shallow(<MyComponent />);
  });

  describe('prop checking', () => {
    checkProps('MyComponent', obj, 'title', 'SomeTitle');
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...