Redux Action测试报错:看似相等的对象判定为不相等
解决Redux Action测试中对象断言不相等的问题
嘿,这个问题我之前也踩过坑!看起来两个对象属性值完全一致,但断言就是失败,核心原因在于JavaScript对象的比较逻辑和你用的断言方法:
为什么会失败?
Chai的expect(result).to.equal(expectedAction)用的是严格相等(===),它比较的是两个对象的内存引用——哪怕两个对象的属性和值完全匹配,只要是不同的实例,内存地址不一样,就会判定为不相等。你代码里的result是logIn函数返回的新对象,expectedAction是手动创建的另一个对象,它们是两个独立的实例,所以断言失败。
怎么修复?
要比较对象的内容是否一致,你需要用Chai的deep.equal方法,它会递归检查对象的所有属性和值:
修改测试代码里的断言行:
// 把原来的to.equal换成to.deep.equal expect(result).to.deep.equal(expectedAction);
修改后的完整测试代码:
import * as actions from '../actions/userActions'; import * as types from '../actions/actionTypes'; import user from '../reducers/userReducer'; describe('user login reducer test', () => { it('should update initialState to include email', () => { const email = 'email' const expectedAction = { type: LOG_IN, email: 'email' } const result = actions.logIn(email); expect(result).to.deep.equal(expectedAction); // 这里是修改点 }) })
另一种更清晰的测试方式
其实你还可以拆分断言,直接验证Action的类型和email属性,这样不仅避免了引用问题,测试逻辑也更直观:
it('should create a valid LOG_IN action', () => { const testEmail = 'email'; const action = actions.logIn(testEmail); // 分别验证类型和属性值 expect(action.type).to.equal(types.LOG_IN); expect(action.email).to.equal(testEmail); })
这样哪怕后续Action结构有小变化,测试也更容易维护~
内容的提问来源于stack exchange,提问作者abefromdublin
相关产品推荐
相关产品推荐

