如何有条件地发送/quot;“级联”;Redux中的行动
我正在开发一个香草js应用程序(自包含的UI组件),我一直在尝试使用Redux使一些逻辑更易于测试和推理 有一个UI事件/用户操作(我们称之为“DO_SOMETHING_action”),可以通过两种不同的方式在UI中触发:如何有条件地发送/quot;“级联”;Redux中的行动,redux,redux-thunk,Redux,Redux Thunk,我正在开发一个香草js应用程序(自包含的UI组件),我一直在尝试使用Redux使一些逻辑更易于测试和推理 有一个UI事件/用户操作(我们称之为“DO_SOMETHING_action”),可以通过两种不同的方式在UI中触发: 通过按键 用鼠标拖动 对于#1,它足够简单-我很高兴让UI组件确定是否在事件处理程序中按下了相应的键,并直接发送Redux“DO#u SOMETHING_ACTION” 对于#2,关于我们是否应该发送“做某事”或“做其他事情”(或者可能什么都不做)的业务规则非常复杂。我希望
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.
}
}
export const dragOverAction=函数(有效负载:DragOverActionPayload){
返回函数(dispatch:dispatch,getState:()=>GlobalStateTree){
//各种业务逻辑
如果(某些条件){
返回;
}
如果(其他条件){
发送(剂量测量)({
}));
}else if(另一种情况){
调度(doSomethingElse)({
}));
}
//否则,不要发送任何东西。
}
}
测试并不像我预期的那么糟糕:
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>);
});
});
从“redux mock store”导入configureMockStore;
从“redux thunk”导入thunk;
export const mockStore=configureMockStore([thunk]);
将*作为“./app/actions/index”中的所有操作导入;
描述(“dragOverAction”,函数(){
它(“应该”,异步函数(){
let store=mockStore();
等待门店发货(allActions.dragOverAction({
福:酒吧,
}));
const actions=store.getActions();
期望(动作);
});
});
如果问题标题有误导性,请道歉-请随意更改为更合适的标题!让一个名为的函数shoulddosomething(当前状态)
返回布尔值怎么样。然后使用该函数确定是否应调度操作。然后针对该函数编写单元测试。@sissonb它将需要返回一个操作(“DO_SOMETHING”、“DO_SOMETHING_ELSE”或null),因为我想测试该操作是否正确填充。但是,是的,这似乎是“可能工作的最简单的事情”-谢谢你可以做两个函数。一个用来做某事,另一个用来做某事<代码>应做某事(当前状态)应做某事(当前状态)