我已经测试了下一个代码,但是现在我遇到了一个难解的难题,严格来说就是用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);
});
答案 0 :(得分:0)
TDD的第一条规则是,在测试失败之前,我们不能编写任何生产代码。
这仅意味着如果要添加生产代码,则必须编写一个需要它的测试。
也就是说,在某些情况下,我不会编写单元测试,而让较大的测试抓住该功能,例如在简单委派的情况下-代码没有执行任何逻辑,只是将相同的参数传递给另一个功能,因此没有真正要测试的东西,并且将从外部测试接线。
但是,在这种情况下,在我看来,您要调用该函数两次以获取不同的信息。
您可以扩展现有测试以包括新数据,但是我不喜欢该选项。我宁愿保留现有测试,并为新功能添加新测试。注意,“随着测试变得更加具体,代码变得更加通用”,在这里也是如此。也许当第三次调用loadCounter
时,您需要将代码重构为更通用的,但是在这一点上,我只添加第二个单元测试。
所有这些,您绝对应该将逻辑代码和组件代码分开。没有任何理由将此单元测试视为酶测试。 componentDidMount
中的代码可以很容易地重构为可以通过普通ol'测试进行单元测试的功能。