¿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 .

  • Jasmine: testing de que la promise devuelta es una exception concreta
  • Mocking Angular $ window en casos de testing unitaria
  • ¿Cómo probar el código del lado del cliente con NodeUnit?
  • Prueba Angular2: ¿Cuál es la diferencia entre un DebugElement y un object NativeElement en un ComponentFixture?
  • ¿El jasmine necesita sinon.js?
  • Haga $ httpBackend ignore cualquier request hecha al server
  • Probando que un module JS es compatible con CommonJS o AMD
  • Prueba angular de 2 unidades no espera a que la promise regrese
  • Pasando un argumento de línea de command a jstestdriver JAR de ANT?
  • ¿Cómo simular events de drag and drop HTML5 en JavaScript?
  • Las testings de jasmine dan error "Uncaught ReferenceError: require no está definido"
  • Cómo probar en destruir scope
  • ¿Cómo restablecer realmente las expectativas de $ httpBackend?
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.