javascript - test - jazmín: spyOn(obj, ''método''). andCallFake o and.callFake?
karma js (1)
Sí, la API espía cambió de Jasmine 1.3.1 a Jasmine 2.0. No hay una versión "correcta". Si puede encontrar la herramienta de soporte para Jasmine 2.0, le recomiendo que actualice.
Sintaxis de Jasmine 1.3.1 ( documentation )
spyOn(mBankAccountResource, ''getBankAccountData'').andCallFake(fakedFunction);
expect(mBankAccountResource.getBankAccountData.mostRecentCall.args).toEqual(["foo"]);
Sintaxis de Jasmine 2.0 ( documentation )
// Methods moved to ''and'' property
spyOn(mBankAccountResource, ''getBankAccountData'').and.callFake(fakedFunction);
// Call data moved to ''calls'' property
expect(mBankAccountResource.getBankAccountData.calls.mostRecent().args).toEqual(["foo"]);
Menciono el soporte de herramientas porque parece que ese es el problema que estás teniendo. Jasmine 2.0 solo ha estado disponible durante un par de meses (en el momento de escribir esto). El soporte para Jasmine 2.0 en Karma, en comparación, ha estado fuera por un par de semanas (no estoy seguro acerca de otras herramientas).
Para resolver su problema, investigue qué herramienta (s) está (n) utilizando para ejecutar pruebas y ver si alguno de ellos es compatible con Jasmine 2.0. Si todos lo hacen, entonces ve a la actualización. De lo contrario, reduzca las pruebas de su navegador a Jasmine 1.3.1 y espere hasta que el soporte de la herramienta sea mejor. Solo asegúrate de ser coherente en todos los ámbitos.
Quiero simular datos de prueba en mis pruebas de Jasmine. Aquí hay dos versiones:
// version 1:
spyOn(mBankAccountResource, ''getBankAccountData'').and.callFake(fakedFunction);
// version 2:
spyOn(mBankAccountResource, ''getBankAccountData'').andCallFake(fakedFunction);
Cuando ejecuto mis pruebas con un navegador (Chrome, Firefox), la primera versión funciona. Sin embargo, cuando ejecuto la misma prueba con phantomjs, tengo que usar la segunda versión. De lo contrario, se queja de que la función no está definida.
Aquí están los mensajes de error:
// phantomjs (with version 1)
TypeError: ''undefined'' is not an object (evaluating ''spyOn(mBankAccountResource, ''getBankAccountData'').and.callFake'')
at /home/phil/workspaces/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65
at invoke (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular/angular.js:3707)
at workFn (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular-mocks/angular-mocks.js:2149)
undefined
// Chrome (with version 2)
TypeError: Object function () {
callTracker.track({
object: this,
args: Array.prototype.slice.apply(arguments)
});
return spyStrategy.exec.apply(this, arguments);
} has no method ''andCallFake''
at Object.<anonymous> (/home/phil/workspaces/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65:59)
at Object.invoke (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular/angular.js:3707:17)
at Object.workFn (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular-mocks/angular-mocks.js:2149:20)
Busqué en la API de Jasmine pero no pude encontrar la versión correcta. Todos los ejemplos que encontré parecen usar la segunda versión.
¿La API de Jasmine cambió recientemente? ¿Cómo puedo escribir mis pruebas, así que siempre funciona?