react-native - 使用带有 getState() 的 mockStore 进行 Thuk 测试
问题描述
我在使用模拟商店测试 thunk 时遇到问题。
在我的 thunk 中,我调用 getState() 来获取 redux 存储的状态,然后根据状态调度操作。
如何让我的 thunk getState() 调用来检查模拟存储状态而不是 redux 存储状态?
import {initialState} from '../configureStore'
import {saveAndSendTask} from '../thunks/queueThunk'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import * as actions from '../actions/index'
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
describe('Testing TaskQueue Thunk', () => {
const store = mockStore(initialState)
test('Test TaskQueue thunk sends to sever and removes from queue.', () => {
// removed variables test data for the sake of brevity.
// Add actions to Mock Store and set up Base state needed to test.
store.dispatch(actions.addToTaskQueue(task1))
store.dispatch(actions.addToTaskQueue(task2))
store.dispatch(actions.setTasks([task1, task2, task3]))
store.dispatch(actions.selectTask(task3.id))
store.dispatch(actions.isConnected(true))
// This is the thunk I want to test.
store.dispatch(saveAndSendTask())
expect('something').toEqual('something')
})
)}
这是我要测试的thunk。
export const saveAndSendTask = (): any => {
return (dispatch: Dispatch, getState) => {
// This state is the same as initial state of redux store. Ignores Mock store state.
console.log(getState())
// Selected task is undefined.
dispatch(addToTaskQueue(getState().tasks.selectedTask))
// ....rest of logic.....
}
}
解决方案
redux-mock-store
不更新状态,只记录传递给调度的动作。
此外,在库中实现该getState
方法的代码要么返回传递的初始状态,要么返回一个函数。
getState () {
return isFunction(getState) ? getState(actions) : getState
}
根据文档:
请注意,此库旨在测试与动作相关的逻辑,而不是与减速器相关的逻辑。换句话说,它不会更新 Redux 存储。如果您想要一个将动作和reducers 组合在一起的复杂测试,请查看其他库(例如redux-actions-assertions)。有关详细信息,请参阅问题#71。
您可以尝试另一个库,遵循 #71 中提到的建议,手动将操作传递给您的减速器以获取您期望的更新状态,或者修改您的规范以验证saveAndSendTask
使用预期的先前状态调度的操作来初始化您的模拟商店。
推荐阅读
- cuda - anaconda 如何挑选 cudatoolkit
- ruby - 如何在 Ruby TK 中创建日历小部件
- c# - 来自 SSRS 中的直接 URL 的损坏的 PDF
- vb.net - VB.NET中的剪贴板数据排序
- angularjs - Angularjs 计算表单字段验证
- python - 是否可以将 django-celery-beat 与 django-tenant 一起使用?
- typescript - 什么时候需要一个“is”谓词,而不是使用“in”运算符?
- .net-core - Avalonia.UI 是否支持 MessageBox?
- r - 如何更改R中的默认换行符
- php - 如何在PHP中的n个字符后打破div id文本