【发布时间】:2016-01-01 12:27:53
【问题描述】:
我正在为我的基于 react 和 redux 的应用程序编写测试用例。
container = TestUtils.renderIntoDocument(
<Provider store={createStore({"key": "old_val"})}>
{() => <Component />}
</Provider>
);
在使用initialState 渲染后,我调度一个动作并查看状态是否改变。
Component.store.dispatch({ type: 'SET_VAL', value: 'some_val' });
然后我打印状态
console.log(store.getState());
我希望状态为{"key": "some_val"}。但是,它仍然显示{"key": "old_val"}。
应用程序工作正常,只是没有测试,所以我的action-creators 或reducers 不会有任何问题。
我在这里做错了吗?顺便说一句,我正在使用 thunk 中间件进行异步操作分派。这会干扰这里吗?如果是,我如何等到异步操作完成?
更新:
redux 测试 shown here 非常简单,但它们似乎工作正常。
store.dispatch(addTodo('Hello'));
expect(store.getState()).toEqual([{
id: 1,
text: 'Hello'
}]);
【问题讨论】:
-
你是否考虑过在不设置 React 的情况下测试你的 action creators 和 reducers? action creators 和 reducers 都只是纯函数,因此很容易自己调用它们并验证输出。如果你愿意,我可以写一个答案来演示。
-
哦,是的,我意识到我在 Q 中错过了这一点,所以添加了。虽然我还没有为动作创建者和减速器添加测试,但它们工作正常并且我已经验证了。
-
我想我不明白为什么您需要验证
react-redux的管道在您的应用程序测试中是否正常工作。将react-redux作为一个单独的库的目的之一是您可以单独测试您的减速器和动作创建器。你能详细说明一下吗? -
我正在根据状态在我的组件中呈现一些信息。所以只需要编写测试来验证当我改变状态时渲染的文本是否改变。但你说得有道理,如果我测试单个单元,整体功能应该可以正常工作。
-
由于状态作为
props传递给您的connected 组件,因此react和react-redux负责确保将更新传播到您的组件。如果您需要根据状态更改来测试组件输出,您实际上可以将测试状态作为props传递,并且也可以单独使用组件。组件是状态的纯(-ish)函数,与 reducer 和 action creators 类似,因此适用相同的想法。