使用 Redux Thunk 测试 AsyncStorage
Posted
技术标签:
【中文标题】使用 Redux Thunk 测试 AsyncStorage【英文标题】:Testing AsyncStorage with Redux Thunk 【发布时间】:2021-08-18 03:56:32 【问题描述】:当我尝试测试是否将 Cat 正确添加到异步存储时,我收到 null。我该如何解决这个问题?在应用程序中正常工作。我正在使用 React Native、React-Native-Async-Storage、Redux Thunk 和 Redux Persist。
减速器
export const INITIAL_STATE: CatsState =
cats: [],
selectedCat: null
const catsReducer = (state = INITIAL_STATE, action: CatsAction): CatsState =>
switch (action.type)
case CatsActionTypes.SET_CATS:
return ...state, cats: action.payload
case CatsActionTypes.SELECT_CAT:
return ...state, selectedCat: action.payload
default:
return state
动作
export const addCat = ( cat : AddCatData): ThunkAction<void, RootState, null, CatsAction> =>
return async (dispatch: Dispatch<CatsAction>) =>
try
const response = await AsyncStorage.getItem(STORAGE_KEYS.cats)
const cats: Cat[] = response ? JSON.parse(response) : []
cats.push(cat)
await AsyncStorage.setItem(STORAGE_KEYS.cats, JSON.stringify(cats))
dispatch( type: CatsActionTypes.SET_CATS, payload: cats )
catch (error)
console.log(error)
测试
beforeEach(async () => await AsyncStorage.clear())
describe('add cat', () =>
it('persist cat correctly into local storage', async () =>
const cat: Cat =
id: '1',
name: 'Cat',
breed: 'Breed',
age: 1,
gender: 'male',
weight: 5,
size: 'Big',
color: 'Brown',
mood: 'Angry',
description: 'Cat description',
friendly: 3,
liked: true
addCat( cat )
const response = await AsyncStorage.getItem(STORAGE_KEYS.cats)
const cats: Cat[] = JSON.parse(response)
const expectedArray = cats: [cat]
expect(cats).toStrictEqual(expectedArray)
)
)
谢谢
【问题讨论】:
【参考方案1】:使用官方文档react-native-async-storage
包:https://react-native-async-storage.github.io/async-storage/docs/advanced/jest
更新:
对于您的情况,您需要执行几个步骤:
#1 模拟您的数据
const CAT_MOCK =
id: '1',
name: 'Cat',
#2 模拟存储
const STORAGE_MOCK =
[STORAGE_KEYS.cats]: [CAT_MOCK]
#3 适用于您的案例的模拟库
jest.mock('@react-native-async-storage', () => (
getItem: jest.fn((item) =>
return new Promise((resolve, reject) =>
resolve(STORAGE_MOCK[item]);
);
),
));
【讨论】:
我已经做了,还是不行 好的,在模拟库之后,您需要为您的案例添加模拟。我给你举个例子 谢谢,但我不明白的是mockItems[item] =(的部分 对不起,我更新了答案。使用STORAGE_MOCK[item]
而不是mockItems[item]
以上是关于使用 Redux Thunk 测试 AsyncStorage的主要内容,如果未能解决你的问题,请参考以下文章
使用 Redux Thunk 测试 AsyncStorage
使用 Redux Thunk 和 Axios 测试 Action Creator