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.