如何使用tdd重复行为进行测试

时间:2018-07-31 23:30:23

标签: unit-testing testing tdd

我已经测试了下一个代码,但是现在我遇到了一个难解的难题,严格来说就是用tdd进行添加

"this.loadCounter('anotherReq', 'anotherError', differentCallback);"

我只需要回答测试以测试行为,但不确定是否有必要。

class Statistic extends PureComponent<Props, State> {
  state = {
  };

  componentDidMount() {
    this.loadCounter('suggestedReqCount', 'hasSuggestedReqsErrors', getCountSuggestedReqs);

    this.loadCounter('anotherReq', 'anotherError', differentCallback);
  }

  loadCounter = async (
    stateCounterKey: string, stateCounterErrorKey: string, loaderFunction: Function) => {
    try {
      const count = await loaderFunction();
      this.setState({
        [stateCounterKey]: count,
      });
    } catch (ex) {
      this.setState({
        [stateCounterErrorKey]: true,
      });
    }
  }
}

这是我的考验

test('Should set state with suggested requirement count', async () => {
  const wrapper = mount(
    <Statistic
      intl={{
        formatMessage: jest.fn(),
      }}
    />,
  );
  wrapper.update();
  await getCountSuggestedReqs();
  expect(wrapper.state().suggestedReqCount).toBe(5);
});

test('Should on fail load suggested reqs update state', async () => {
  getCountSuggestedReqs.mockReturnValueOnce(Promise.reject('Error creado'));
  const wrapper = mount(
    <Statistic
      intl={{
        formatMessage: jest.fn(),
      }}
    />,
  );
  wrapper.update();
  await getCountSuggestedReqs();
  expect(wrapper.state().hasSuggestedReqsErrors).toBe(true);
});

1 个答案:

答案 0 :(得分:0)

TDD的第一条规则是,在测试失败之前,我们不能编写任何生产代码。

这仅意味着如果要添加生产代码,则必须编写一个需要它的测试。

也就是说,在某些情况下,我不会编写单元测试,而让较大的测试抓住该功能,例如在简单委派的情况下-代码没有执行任何逻辑,只是将相同的参数传递给另一个功能,因此没有真正要测试的东西,并且将从外部测试接线。

但是,在这种情况下,在我看来,您要调用该函数两次以获取不同的信息。

您可以扩展现有测试以包括新数据,但是我不喜欢该选项。我宁愿保留现有测试,并为新功能添加新测试。注意,“随着测试变得更加具体,代码变得更加通用”,在这里也是如此。也许当第三次调用loadCounter时,您需要将代码重构为更通用的,但是在这一点上,我只添加第二个单元测试。

所有这些,您绝对应该将逻辑代码和组件代码分开。没有任何理由将此单元测试视为酶测试。 componentDidMount中的代码可以很容易地重构为可以通过普通ol'测试进行单元测试的功能。