You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:29