Redux单元测试 - 减速器和动作创建器

时间:2016-07-29 15:25:54

标签: unit-testing redux

我最近在学习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
}])

我想使用硬编码动作是最好的做法不是吗?

1 个答案:

答案 0 :(得分:3)

有趣的问题,我想说这取决于你如何运行你的测试套件。就个人而言,我对这些行为进行了硬编码,因为如果你仔细想想,他们会以声明的方式解释减速器的期望。支持导入操作的论据是,如果您更改其源,则不需要更新测试。但是,这也意味着您在运行这些测试之前始终期望您的操作始终正确。

如果是这种情况(如果你总是在此之前运行你的动作测试套件),那么在你的reducer测试套件中导入它们是合理的。反对这种逻辑的唯一论据是,让新开发人员只通过查看reducer测试套件来了解减速器是​​如何工作的并不容易,因为他们还需要查看动作源文件以查看是什么调度动作的类型。

另一方面,对您的操作进行硬编码更具说明性,但如果您的操作发生更改,则需要更新每个reducer测试。我仍然推荐这种方法的原因是,它允许您发送更多受控数据,但我同意它会增加维护成本。