测试Redux:Reducer的测试是否应该使用动作?

时间:2016-06-17 10:21:09

标签: unit-testing redux

我目前正在学习Redux。 到目前为止,当我发现如何管理州应用程序时,我不想专注于与框架(如React)的任何集成。我只想深入了解Redux背后的想法和概念。

我遵循了Dan Abramov在egghead.io上提供的课程。

我喜欢他通过测试他的应用程序解释的方式,所以我开始以同样的方式玩Redux。

我使用Redux构建了一个应用程序。当然它有多个减速器和动作。 我不会在这里分享任何代码,因为它没有特别的兴趣。

更重要的是如何处理测试和Redux。

我不知道如果我应该在我的测试中嘲笑动作,那么用相应的动作测试减速器是否有意义。

我开始嘲笑这些行为,因为起初我认为分离我的测试并且没有减速器和动作之间的依赖关系是一个好主意。 (这是我在大多数教程中看到的内容。但在教程中,他们经常构建小型应用程序。)

现在,我发现我有时会得到一个与相应动作不同的模拟,即使我的测试很好,当我使用dispatch(myAction())时,它可能会在真正的应用程序中破坏它将是不同于预期的东西。

我应该在减速机测试中使用我的操作吗?

非常感谢你对此有任何解释。

编辑:一些代码有更好的解释

减速器

case CREATE_USER_IN_PROJECT:
    currentProject = state.filter(p => p.id === action.payload.idProjet)[0]

    indexCurrentProject = state.indexOf(currentProject)

    people = [
        ...currentProject.people,
        action.payload.idUser
    ]

    return [
        ...state.slice(0, indexCurrentProject),
        Object.assign({}, currentProject, {people}),
        ...state.slice(indexCurrentProject + 1)
    ]

REDUCER&T; TEST

it('CREATE_PROJECT if no project should only have the new project', done => {
    let idNewProject = uuid.v4()

    expect(
        projects(undefined, {
            type: CREATE_PROJECT,
            payload: {
                id: idNewProject,
                name: 'New project !'
            }
        })
    )
    .toEqual([{
        id: idNewProject,
        name: 'New project !',
        people: [],
        money: '€',
        operations: [],
        archived: false,
        closed: false
    }])

    done()
})

所以在这里,而不是

{
    type: CREATE_PROJECT,
    payload: {
        id: idNewProject,
        name: 'New project !'
    }
}

我应该拨打我的行动createProject('New project !')吗?

1 个答案:

答案 0 :(得分:2)

感谢您的澄清。结果我在评论中误解了你。这是一个希望更有帮助的解释。

您不应该使用您的实际操作,例如createProject('New project !'),用于测试您的减速机。

Reducers是简单的状态机,它接受输入并返回输出。您的测试应该检查他们是否正是这样做,其中: input = previous state > output = next state。是的它仍然算作单元测试(我不明白它为什么不会)。

我发现了a good read on how to test reducers