测试代码
it("基本功能 订阅通知 改变状态", () => {
const { createStore } = require("../index");
const mockFn = jest.fn();
const reducer = (state = { num: 1 }, payload) => {
switch (payload.type) {
case "clear":
return { num: 0 };
case 'add':
return { num: state.num++ };
default:
return state;
}
}
const store = createStore(reducer);
// 建立响应订阅
store.effect(mockFn);
store.dispatch({
type: "clear",
});
// store.dispatch({ type: "add", payload: 1 });
const calls = mockFn.mock.calls;
// 断言 mock方法只调用一次
expect(calls.length).toBe(1);
expect(store.getState().num).toBe(0);
});
功能实现
let store;
let effects = []
module.exports = {
createStore: (reducer) => {
let dispatch = (payload) => {
store = reducer(store, payload)
effects.forEach(item => item())
}
let effect = (fn) => {
effects.push(fn);
}
let getState = () => {
return store
}
return {
dispatch,
effect,
getState
}
}
}