Cuando ejecuto las siguientes declaraciones usando diferentes versiones de nodos, veo una diferencia en el resultado de la afirmación. Estoy usando v10.15.1 donde pasa la aserción. Pero el mismo código en v14.18.1 arroja un error.
const assert = require('assert') var err = new Error('some error'); var d = [{ 'error':[err] }] var expected = [{ 'error':[{}] }] assert.deepEqual(d,expected)El error es el siguiente:
assert.js:118 throw new AssertionError(obj); ^ AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal: [ { error: [ Error: some error at Object.<anonymous> (/Users/username/Desktop/repos/temp_files/test.js:2:11) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Function.executeUserEntryPoint [as r... should loosely deep-equal [ { error: [ [] ] } ] at Object.<anonymous> (/Users/username/Desktop/repos/temp_files/test.js:9:8) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12) at internal/main/run_main_module.js:17:47 { generatedMessage: true, code: 'ERR_ASSERTION', actual: [ { error: [ Error: some error at Object.<anonymous> (/Users/username/Desktop/repos/temp_files/test.js:2:11) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12) at internal/main/run_main_module.js:17:47 ] } ], expected: [ { error: [ [] ] } ], operator: 'deepEqual' }Me referí a la documentación para ambas versiones pero no la encontré útil.
Entiendo, por supuesto, que el objeto de error está vacío en uno pero no en el otro. Pero no puedo encontrar la razón por la que v10 lo ignora y lo que cambió más tarde por lo que ahora se detecta el error
El comportamiento de assert.deepEqual se cambió en Node.js 12 con esta solicitud de extracción. Parte de la motivación detrás del cambio fue el requisito de alinear la comparación igual laxa con la comparación igual estricta cuyo comportamiento había sido más predecible desde el principio. En consecuencia, la afirmación
assert.deepEqual(new Error('test'), { });pasa en Node.js < 12 pero falla en Node.js 12 y posteriores.
La explicación simple es que los Error s son objetos sin propiedades enumerables propias. En la versión anterior de Node.js, el hecho de que un Error y un literal de objeto vacío ( { } ) sean ambos objetos sin propiedades enumerables propias fue razón suficiente para que ambos se compararan vagamente iguales. El comportamiento cambió en Node.js 12 donde la documentación de deepEqual dice:
Los nombres y mensajes de
Errorsiempre se comparan, incluso si no son propiedades enumerables.
De acuerdo, esto no hace que el cambio que observaste sea obvio de ninguna manera.