我最近在学习Redux并使用Jest
编写单元测试作为TDD过程的一部分我为动作创作者和缩减者编写测试。但我正在努力:我可以在减速器测试中使用动作创建器吗?
import * as types from './../../constants/auth';
import * as actions from './../../actions/auth';
import reducer, {initialState} from './../auth';
我可以这样做吗
it('should set isFetching to true', () => {
const expectedState = {
...initialState,
isFetching: true
}
expect(
reducer(initialState, actions.loginPending())
).toEqual(expectedState)
});
而不是这个?
it('should set isFetching to true', () => {
const expectedState = {
...initialState,
isFetching: true
}
expect(
reducer(initialState, {type: types.LOGIN_PENDING})
).toEqual(expectedState)
});
我之所以怀疑是因为官方文档在reducer测试中使用了硬编码操作:
expect(
reducer([], {
type: types.ADD_TODO,
text: 'Run the tests'
})
).toEqual([{
text: 'Run the tests',
completed: false,
id: 0
}])
我想使用硬编码动作是最好的做法不是吗?
答案 0 :(得分:3)
有趣的问题,我想说这取决于你如何运行你的测试套件。就个人而言,我对这些行为进行了硬编码,因为如果你仔细想想,他们会以声明的方式解释减速器的期望。支持导入操作的论据是,如果您更改其源,则不需要更新测试。但是,这也意味着您在运行这些测试之前始终期望您的操作始终正确。
如果是这种情况(如果你总是在此之前运行你的动作测试套件),那么在你的reducer测试套件中导入它们是合理的。反对这种逻辑的唯一论据是,让新开发人员只通过查看reducer测试套件来了解减速器是如何工作的并不容易,因为他们还需要查看动作源文件以查看是什么调度动作的类型。
另一方面,对您的操作进行硬编码更具说明性,但如果您的操作发生更改,则需要更新每个reducer测试。我仍然推荐这种方法的原因是,它允许您发送更多受控数据,但我同意它会增加维护成本。