我目前正在学习 Redux。 到目前为止,当我发现如何管理状态应用程序时,我不想专注于与框架(如 React)的任何集成。我只是想很好地理解 Redux 背后的想法和概念。
我遵循了 Dan Abramov 在 egghead.io 上提供的类(class).
我喜欢他通过测试他的应用程序来解释的方式,所以我开始以同样的方式使用 Redux。
我用 Redux 构建了一个应用程序。当然它有多个 reducer 和 Action 。 我不会在这里分享任何代码,因为它没有特别的兴趣。
更多的是如何处理测试和 Redux 的问题。
我不知道用相应的操作来测试 reducer 是否有意义,或者我是否应该在测试中模拟这些操作。
我首先模拟了这些操作,因为一开始,我认为将测试分开并且在 reducer 和操作之间不存在依赖关系是一个好主意。 (这是我在大多数教程中看到的。但在教程中他们经常构建小型应用程序)。
现在,我发现有时我会得到一个与相应操作不同的模拟,即使我的测试很好,当我使用dispatch(myAction())时,它也可能会在真实的应用程序中崩溃与预期不同。
我应该在 reducer 测试中使用我的操作吗?
非常感谢您对此的任何解释。
编辑:一些代码有更好的解释
reducer
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 测试
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 !')
吗?
最佳答案
感谢您的澄清。原来我在评论中误解了你的意思。希望这里有更有用的解释。
您不应该使用您的实际行动,例如createProject('New project !')
,测试您的 reducer 。
Reducer 是简单的状态机,它接受输入并返回输出。您的测试应该检查它们是否确实做到了这一点,其中:
输入 = 前一个状态 > 输出 = 下一个状态
。是的,它仍然算作单元测试(我不明白为什么它不会)。
关于unit-testing - 测试 Redux : Should tests of a Reducer use actions or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37879078/