unitarias pruebas karma hacer como jasmine karma-jasmine

pruebas - Error de caso de prueba de Jasmine ''Espiar para haber sido llamado''



pruebas unitarias ionic (1)

Estoy escribiendo el caso de prueba de jazmín para la función angular inferior y el mensaje de error de caso de prueba "Espera espía [Objeto objeto] que se ha llamado".

$scope.displayTagModelPopup = function() { var dialogOptions = { templateUrl: ''views/mytags.html'', controller: ''TagsCtrl'', size: ''lg'', resolve: { tagsAvailable: function() { return $scope.availableTags; } } }; ModalDialogFactory.showDialog(dialogOptions).then(function(result) { $scope.selectedFields = []; $scope.selectedFieldIds = []; angular.forEach(result, function(tag) { $scope.selectedFields.push(tag); $scope.selectedFieldIds.push(tag.objectId); }); }); };

Mi caso de prueba de jazmín

it(''should call displayTagModelPopup'', function() { var dialogOptions = { templateUrl: ''views/mytags.html'', controller: ''TagsCtrl'', size: ''lg'', tagsAvailable: [{ objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0", dataFieldName: "author", shortNamePath: "$.author", templates: ["HaM sheet"] }] }; var spy = jasmine.createSpy(modalDialogFactory, ''showDialog'').and.callFake(function(data) { $scope.tags = [{ objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0", dataFieldName: "author", shortNamePath: "$.author", templates: ["HaM sheet"] }]; return $scope.tags; }); $scope.displayTagModelPopup(); $scope.$digest(); expect(spy).toHaveBeenCalled(); });

Y obteniendo el siguiente error "Espía esperado [Objeto objeto] para que se haya llamado. Error: espía esperado [Objeto objeto] para que se haya llamado".

¿Cuál es el problema en mi caso de prueba? ¿Me falta algo?

¡¡¡Gracias por adelantado!!!

Editado: Cambié mi caso de prueba de Jasmine como a continuación obtengo un mensaje diferente '''' undefined ''no es una función (evaluando'' ModalDialogFactory.showDialog (dialogOptions) .then '')''

Probé si ModelDialogFactory está definido o no, pero el método ModalDialogFactory.showDialog se definió correctamente. el caso de prueba de error falló solo al llamar al método ''$ scope.displayTagModelPopup ();''

it(''should call displayTagModelPopup'', function() { spyOn(ModalDialogFactory, ''showDialog'').and.callFake(function() { $scope.tags = [{ objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0", dataFieldName: "author", shortNamePath: "$.author", templates: ["HaM sheet"] }]; return $scope.tags; }); var dialogOptions = { templateUrl: ''views/mytags.html'', controller: ''TagsCtrl'', size: ''lg'', tagsAvailable: [{ objectId: "c647abc7-f651-4df6-880d-cf9fb69cdcb0", dataFieldName: "author", shortNamePath: "$.author", templates: ["HaM sheet"] }] }; //expect(ModalDialogFactory).toBeDefined(); //expect(ModalDialogFactory.showDialog).toBeDefined(); $scope.displayTagModelPopup(); $scope.$digest(); });


Si desea espiar un método de objeto existente, debe usar spyOn helper ( docs ):

spyOn(modalDialogFactory, ''showDialog'').and.callFake(...);

Como primer parámetro, aplica un objeto y como segundo nombre del método. Reemplaza el método de un objeto existente con un objeto espía.

Para verificar si se llamó al espía, debe pasarlo a expect() :

expect(modalDialogFactory.showDialog).toHaveBeenCalled();

El ayudante que usas jasmine.createSpy() es crear un espía "desnudo", que se puede pasar como una devolución de llamada para garantizar que se llame ( documentos ). jasmine.createSpy() solo aplica un parámetro que es el nombre del espía que se mostrará en los resultados de las pruebas, por eso no hay ningún espía conectado a su objeto.

Actualizar:

Tienes una línea en el primer fragmento:

ModalDialogFactory.showDialog(dialogOptions).then(function(result) { ... });

y como puede ver, showDialog() es seguido por then() . Supongo que showDialog() original showDialog() devuelve un objeto con un método y then() , tal vez es una Promesa. Pero en su prueba cuando espía un método showDialog() , desde callFake() no devuelve nada con el método then() , por lo tanto, el error indica que un método no está definido. Spy reemplazó por completo su método original y junto con callFake() recrea el comportamiento original.

Entonces, desde callFake() debes devolver algo que imite una Promesa, por ejemplo:

spyOn(ModalDialogFactory, ''showDialog'').and.callFake(function() { // .... return { then: function (cb) { cb($scope.tags); } }; });

Aquí devuelvo un objeto que tiene el método then() , y cuando se llama con una función como parámetro, esta función que actúa como una devolución de llamada se resuelve con un valor de $scope.tags , que podría usarse dentro de esta devolución de llamada.