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.