¿Por qué jasmine no puede comparar los objects observables knockout.js pero funciona con funciones normales?

Estaba escribiendo testing de jasmine hoy y tuve que burlarme del resultado de un object knockout.js y, para mi sorpresa, no eran iguales, aunque los objects parecían idénticos. Después de eliminar las properties, lo networkinguje a knockout.js observable. Debajo hay dos testings de nocaut, una está fallando, mientras que la que tiene la function es exitosa.

(function() { var describe = window.describe, it = window.it, expect = window.expect; describe("Compare objects that have functions", function() { function AddIsExpandedProperty(recordObject) { recordObject.IsExpanded = ko.observable(false); return recordObject; } it("object that has knockout function", function() { // this fails var recordX = AddIsExpandedProperty({}); expect(recordX).toEqual(AddIsExpandedProperty({})); }); it("object that has normal function", function() { // this succeeds var func = function () { }; var recordY = { f: func }; expect(recordY).toEqual({ f: func }); }); }); })(); 

Me preguntaba por qué? ¿Los observables knockout.js no son meras funciones?

  1. Una solución a este problema sería crear unwrapper que consistiría en desempaquetar todos los observables knockout.js y producir los objects desenrollados. Entonces uno podría compararlos con los burlados, pero esto no sería una testing de unidad real.
  2. Otro sería usar .toBeTruthy() lugar de .toEqual() pero esto de nuevo está poniendo en peligro la testing, si esas funciones serían diferentes pasarían la testing.

¿Qué soluciones hay que no requieran modificaciones de objects?

También hice un bash miserable de escribir un simulacro de testing de jasmine en Plunker.

One Solution collect form web for “¿Por qué jasmine no puede comparar los objects observables knockout.js pero funciona con funciones normales?”

Es natural que los dos objects devueltos por AddIsExpandedProperty no sean iguales.

La function ko.observable devuelve una nueva instancia de function cada vez que la llama. Por lo tanto, puede pensar en ko.observable como una function de constructor, por lo tanto, al verificar la igualdad estricta, dos ko.observable() nunca devuelven el mismo object.

Entonces su contraejemplo no está probando cómo se comporta KO, un ejemplo más exacto sería si su func devuelve una nueva function:

 it("object that has normal function", function() { var func = function () { return function() {} }; var recordY = { f: func() }; expect(recordY).toEqual({ f: func() }); }); 

Por supuesto, este caso de testing también falla como el de KO.

Si desea probar la igualdad de objects con ko.observable properties ko.observable , le sugiero que utilice ko.toJS para convertir sus observables KO en properties normales:

  it("object that has knockout function with toJS", function() { var recordX = AddIsExpandedProperty({}); expect(ko.toJS(recordX)).toEqual(ko.toJS(AddIsExpandedProperty({}))); }); 

Demo Plnkr .

  • Cómo probar una unidad directiva en angular 2?
  • cómo burlarse de la respuesta de hapi.js con sinon para testings unitarias
  • Error de testing unitaria: no se puede llamar a Promise.then desde dentro de una testing de synchronization
  • ¿Cómo burlarse localStorage en las testings de unidades de JavaScript?
  • Primeros pasos con Karma y Jasmine instalados - jasmine.Suite () requirió error
  • ¿Qué es la testing de mitad de path?
  • ¿Cómo probar la unidad de la directiva AngularJs que requiere el controller de la dirección de los padres con Jasmine?
  • Foundation-Apps integración de sitio angular con testing de unidad karma-jasmine
  • ¿Cómo me burlo de un service que promete en la testing de unidad Angularjs Jasmine?
  • ¿Cómo agregas el browser a un proyecto antiguo?
  • Prueba de un componente React que usa el object jQuery & window
  • Burlarse de un useragent en javascript?
  • Usando qUnit para testings de Javascript
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.