Ecmascript 6 基本还原程序可能会改变应用程序状态

Ecmascript 6 基本还原程序可能会改变应用程序状态,ecmascript-6,redux,immutability,reducers,Ecmascript 6,Redux,Immutability,Reducers,我使用Redux-spread操作符希望将状态保持为不可变对象 然而,我正在设法使最简单的单元测试失败 我假设错误可能与不可变有关,但我是否正确使用了扩展运算符 下面是我的单元测试: description('app logic',()=>{ 它('初始化应用',()=>{ const newState=reducer(初始状态,{type:“NEXT”}) 常数预期状态={ 开始:是的, 渲染组件:null, 请求:{}, 结果:{}, } console.log('newState',ne

我使用Redux-spread操作符希望将状态保持为不可变对象

然而,我正在设法使最简单的单元测试失败

我假设错误可能与不可变有关,但我是否正确使用了扩展运算符

下面是我的单元测试:

description('app logic',()=>{
它('初始化应用',()=>{
const newState=reducer(初始状态,{type:“NEXT”})
常数预期状态={
开始:是的,
渲染组件:null,
请求:{},
结果:{},
}
console.log('newState',newState)
console.log('expected state',expectState)
expect(newState).to.equal(expectState)
})

})
不确定您使用的是哪一个测试库,但通常使用类似
的名称。equal
用于测试严格相等(
==
),这意味着(至少在对象的情况下)被比较的两个对象必须实际引用完全相同的对象。那么比如说,

const original = { a: 1 }; // creates a new object, assign it
const testMe = { a: 1 }; // creates another new object, assign it
console.log( original === testMe )   // false
计算结果为false,因为虽然对象具有相同的内容,但它们并不引用完全相同的对象。它们是独立创建的独立对象,碰巧具有相同的内容。与之相比

const original = {a: 1}; // create a new object
const testMe = original;  // create another reference to the same object
console.log( original === testMe );  // true
所以当你回来的时候

return {
  ...state,
  start: true,
}
您正在创建并返回一个新对象,因此它自然不会引用您创建并分配给变量名
expectedState
的同一对象

如果您感兴趣的不是严格的相等,而是两个对象中的内容相同,那么除了
.equal
,还有其他方法,通常用
deep
命名(因为它们深入对象/数组/任何东西以检查值是否相同)

Chai.js在其文档中有
expect(x).to.equal(y)
expect(x).to.deep.equal(y)
的示例:

您的测试库可能具有非常相似(如果不是完全相同的话)的语法