Что происходит
Цикл выполнения 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');
});
});