Comment se moquer de la ressource $ angulaire dans les tests de jasmin
Je suis en train de tester un contrôleur qui utilise angulaire de dollars de ressources.
function PermissionsCtrl($scope, $resource, $cookies) {
var Object = $resource('/v1/objects/:id');
loadObjects();
function loadObjects() {
$scope.myAppObjects = new Array();
var data = AppObject.get({find: '{"app_id": '+wtm.app_id+'}'},
function(){
if (data.results) {
for(var i = 0; i< data.results.length; i++) {
if(!data.results[i].is_deleted) {
(function(i){
$scope.objects(data.results[i]);
}(i));
}
}
}
},
function(error){console.log(error);});
}
Et voici le code de test.
var apiServer = "...";
var app_id = 999
var mock_object_data = {...};
describe('apps permissionsCtrl', function(){
var scope, ctrl, $httpBackend;
//Create a matcher for comparing data
beforeEach( function() {
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
//Create the controller with injected data/services
beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $resource) {
$httpBackend = _$httpBackend_;
//cookie data to inject
var cookies = new Array();
cookies['id'] = '...'; //just needs to be declared
$httpBackend.expectGET(apiServer+'/v1/app_objects? find=%7B%22app_id%22:'+app_id+'+%7D&access_token=' + cookies['id'])
.respond( mock_object_data );
var $injector = angular.injector(['ng', 'ngResource']);
var $resource = $injector.get('$resource');
scope = $rootScope.$new();
ctrl = $controller(PermissionsCtrl, {$scope: scope, $cookies: cookies, $resource: $resource});
}));
it('should put object data into $scope', function() {
$httpBackend.flush();
expect(scope.objects).toEqualData( mock_object_data );
});
});
Lorsque je l'exécute-je obtenir
Error: Unknown provider: $resourceProvider <- $resource
à la ligne où j'essaie de créer mon contrôleur. Je ne comprends pas comment injecter ce dans mon contrôleur et peu importe ce que j'essaie, je reçois la même erreur. Un couple de choses que j'ai essayé sont
- Déclarer un vide de l'objet fantaisie et de le transmettre par le biais de semblable à mon cookies variable. Je me figure ce est probablement une mauvaise solution de toute façon depuis que j'ai réellement envie d'utiliser le service.
- Imitant la portée de la maquette et de la passer dans mon injecter de la fonction et en passant de $ressource.$new() de mon contrôleur.
- De ne rien faire et espérer que httpBackend couvrirait puisque c'est ce qui est appelé de toute façon. Vojta Jína fait que ça sonne comme ça pourrait fonctionner, mais pas de dés.
- Doux épithètes. Satisfaisant mais pas très efficace.
source d'informationauteur akronymn
Vous devez vous connecter pour publier un commentaire.
Essayer d'instancier
$resource
avec le code suivant:Similaires pour d'autres services, sauf quand ils sont dans d'autres modules encore. Puis ajouter ce module à la matrice.
Plus d'infos
Après plus de lecture et plus de l'expérimentation, il semble que la bonne façon de le faire est d'extraire l'utilisation de $de ressources de l'automate. Dans mon cas, j'ai écrit un service qui s'appuie sur $ressource, puis injecter le service dans mon contrôleur. En attendant, je test ce service séparément de mon contrôleur. Meilleure pratique tout autour.
Ma déclaration de service:
et dans mes tests unitaires, je passe à travers un beforeEach la fonction de configuration de