Dans mon application JS angulaire, j'ai un contrôleur principal qui prend en paramètre un userFactory. La userFactory se compose d'un objet appelé userService qui à son tour a un objet userDetails et certaines méthodes, y compris resetUserDetails. (voir plus bas)Utilisation de Jasmine spyOn avec la méthode d'un objet défini dans une usine
Dans le contrôleur principal, j'ai une fonction logOut qui appelle la méthode userFactory.userService.resetUserDetails
. Je voudrais tester cette fonction de logOut avec le jasmin mais je reçois quelques erreurs. Je suis très nouveau à Jasmine alors excuses si c'est quelque chose qui me manque.
Donc d'abord dans ma suite Jasmine je crée un MainControllerSpec pour tester mon mainController.
Dans cette spécification j'injecte une usine appelée userFactory. Je suis en train de spyOn ma méthode resetUserDetails
comme suit toutefois obtenir une erreur:
spyOn(userFactory, 'userService.resetUserDetails');
Erreur: userService.resetUserDetails()
n'existe pas.
J'ai essayé ce processus en créant une fonction appelée test dans mon userFactory (en dehors de l'objet userService) et cela fonctionne bien donc au moins je sais que l'injection d'usine dans la spécification est bien configurée.
Toute aide grandement appréciée. Merci
MainControllerSpec.js
describe("MainController", function() {
beforeEach(angular.mock.module('mapModule', 'ngRoute','ngTouch', 'ngAnimate'));
var scope, userFactory;
beforeEach(inject(function($rootScope, $controller, _userFactory_){
scope = $rootScope.$new();
userFactory = _userFactory_;
$controller('mainController', {
$scope: scope
});
}));
describe('The logOut function', function() {
it('should call the resetUserDetails function of the userFactory.userService object and reset the userDetails object', function() {
//spyOn takes in a factory and a method of that factory
spyOn(userFactory, 'userService.resetUserDetails');
//spyOn(userFactory, 'test'); tried this and it works.
scope.logOut();
expect(userFactory.userService.resetUserDetails).toHaveBeenCalled();
});
});
});
fonction déconnexions dans un mainController
$scope.logOut = function(){
userFactory.userService.resetUserDetails();
//userFactory.test(); //tried this with spyOn in jasmine
}
de UserFactory
mapApp.factory('userFactory', function(){
var userService = {
/*
* Initialize a userDetails object.
*/
userDetails : {
"userID" : null,
"facebookUserID" : "",
"facebookName" : "",
"facebookProfilePic" : "",
"userPrivilegeID" : 1,
"userToken" : "",
"isLoggedIn" : false
},
resetUserDetails : function(){
/*
* This method resets the userDetails object.
*/
this.userDetails = {
"userID" : null,
"facebookUserID" : "",
"facebookName" : "",
"facebookProfilePic" : "",
"userPrivilegeID" : 1,
"userToken" : "",
"isLoggedIn" : false
};
}
};
var test = function(){
/*
* for testing spyOn in Jasmine
*/
};
//return public API so that we can access it in all controllers
return{
userService: userService,
test: test
};
});
Ive juste écopé il. excuses. Ce qui suit fonctionne bien. spyOn (userFactory.userService, 'resetUserDetails'); – Sarah
Habituellement, vous voudrez peut-être se moquer entièrement du service dans les tests du contrôleur au lieu d'espionner ses méthodes une par une. Par exemple. https://stackoverflow.com/a/46595428/3731501 – estus
@estus ok merci pour le conseil. Je vais vérifier cela – Sarah