动态创建的“ it”的嵌套描述和行为

时间:2019-03-29 10:37:11

标签: javascript unit-testing mocha

我在测试中嵌套了describe,并且像往常一样,我在描述中使用了beforeEach和之前的内容。我的describe函数之一调用了辅助函数,该函数创建了动态测试(DRY)。 Mocha运行beforeEach方法之前的嵌套describe的描述。而我动态创建的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 个答案:

答案 0 :(得分:1)

会发生什么

Mocha Run Cycle首先运行所有describe回调函数(...对于其他测试框架,例如JestJasmine也是如此)。

然后,它运行before钩子,然后运行beforeEach钩子,最后运行it回调。

因此checkProps是运行初始describe回调的一部分,并且此时wrapperundefined,因此您已经注意到测试说明说{{ 1}}。

undefined should have...挂钩在beforeEach回调函数运行之前运行...但是它重新定义 it,因此当wrapper回调运行{ {1}}仍然是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属性,因为该对象是从未重新定义。

这是一个有效的测试,可以使您更接近要尝试做的事情:

beforeEach