我正在使用vanilla-js应用程序(自包含UI组件),并且我一直在尝试使用Redux使一些逻辑更容易测试和推理。
有一个UI事件/用户操作(让我们称之为" DO_SOMETHING_ACTION")可以在UI中以几种不同的方式触发:
对于#1来说这很简单 - 我很高兴让UI组件确定在事件处理程序中是否按下了相应的键并调度了Redux" DO_SOMETHING_ACTION"直接
对于#2,业务规则是关于我们是否应该发送" DO_SOMETHING_ACTION"或" DO_SOMETHING_ELSE" (或者根本没有)非常复杂。我希望能够推理和测试这个逻辑 - 因此我的想法是发送一个" MAYBE_DO_SOMETHING"动作(从事件处理程序捕获的最小必要信息和抽象)。
我是否应该通过发送" MAYBE_DO_SOMETHING"来解决这个问题。一个thunk?或者我是以错误的方式解决这个问题?
答案 0 :(得分:0)
使用thunk实现这一点肯定是可能的:
export const dragOverAction = function(payload: DragOverActionPayload) {
return function(dispatch: Dispatch, getState: () => GlobalStateTree) {
// Various business logic
if (someCondition) {
return;
}
if (anotherCondition) {
dispatch(doSomething({
<snip>
}));
} else if (anotherCondition) {
dispatch(doSomethingElse({
<snip>
}));
}
// Otherwise, don't dispatch anything.
}
}
测试没有我预期的那么糟糕:
import configureMockStore from "redux-mock-store";
import thunk from "redux-thunk";
export const mockStore = configureMockStore([thunk]);
import * as allActions from "../app/actions/index";
describe("dragOverAction", function() {
it("should <blah blah>", async function() {
let store = mockStore();
await store.dispatch<any>(allActions.dragOverAction({
foo: bar,
<snip>
}));
const actions = store.getActions();
expect(actions).toBe(<snip>);
});
});