TypeScript Reducer单元测试报错:缺少RepairsPropertyLoadSuccessAction的payload
解决TypeScript Action类型不匹配错误
首先咱们拆解下这个报错:TypeScript明确告诉你,你传给reducer的action缺少payload属性,而RepairsPropertyLoadSuccessAction类型强制要求这个属性必须存在,所以当前的action不符合RepairsAction的类型约束,自然就报错了。
问题根源
你定义的RepairsPropertyLoadSuccessAction类型是这样的:
export type RepairsPropertyLoadSuccessAction = { type: typeof REPAIRS_PROPERTY_LOAD_SUCCESS; payload: RepairsProperty }
它要求这个action必须同时包含type和payload两个字段,但你在测试里只传了type,完全违反了这个类型规则,所以TypeScript直接拦下来了。
修复步骤
1. 给测试action补全合法的payload
你需要构造一个符合RepairsProperty类型的payload传入action。有两种简单方式:
- 直接实例化
RepairsProperty类 - 用字面量模拟一个结构匹配的对象(TypeScript是结构类型系统,只要字段结构一致就认可)
修改后的测试代码如下:
it('should handle REPAIRS_PROPERTY_LOAD_SUCCESS', () => { // 方式1:实例化RepairsProperty类 const mockPayload = new RepairsProperty(); // 方式2:用字面量模拟(更灵活,适合自定义测试数据) // const mockPayload = { models: [{ id: 'test-1', jobNo: 'RJ-001', trade: '水电', /* 其他字段按需填充 */ }] }; const result = reducer(initialState, { type: 'repairs/PROPERTY_PAGE_LOAD_SUCCESS', payload: mockPayload }) // 修正测试期望:原来的{}肯定会失败,要匹配reducer的实际输出逻辑 expect(result).toEqual({ ...initialState, isFetching: false, data: mockPayload.models }); })
2. 修正测试的期望结果
你原来写的expect(result).toEqual({})肯定会失败——你的reducer逻辑是返回{ ...state, isFetching: false, data: action.payload.models },所以必须把期望结果调整为匹配reducer实际输出的结构。
额外提示
如果以后测试不带payload的action(比如REPAIRS_PROPERTY_LOAD),那完全没问题,因为对应的RepairsPropertyLoadAction类型确实只要求type字段。但对于带payload的action类型,一定要严格遵守类型定义传全字段。
内容的提问来源于stack exchange,提问作者Aessandro
相关产品推荐
相关产品推荐

