71 votes

Mocking dépendances des modules angulaires dans les tests unitaires Jasmine

Je suis d'essayer de l'unité de contrôleur de test de code à l'intérieur d'un module qui prend d'autres modules comme des dépendances, mais je n'ai pas été en mesure de comprendre comment se moquer d'eux correctement.

Je suis en utilisant le Jasmin Cadre et l'exécution de mes tests avec le Karma (Testacular).

Code Du Module

var app = angular.module('events', ['af.widgets', 'angular-table']);

app.controller('eventsCtrl', function([dependencies]){
    $scope.events = [];
    ...
});

Spec Code

describe('events module', function(){
    var $scope,
        ctrl;

    beforeEach(function(){
        angular.mock.module('af.widgets', []);
        angular.mock.module('angular-table', []);
        module('events', ['af.widgets', 'angular-table']);
    });

    beforeEach(inject(function($rootScope, $controller){
        $scope = $rootScope.new();
        ctrl = $controller('NameCtrl', {
            $scope: $scope,
        });
    }));

    it('should have an empty events array', function(){
        expect($scope.events).toBe([]);
    })
});

L'erreur que j'obtiens est le Karma est "pas de module af.widgets", alors, évidemment, je ne suis pas moqueur les dépendances de modules à droite. Tous les conseils?

65voto

Davide Icardi Points 2215

Si vous voulez simuler un module qui déclare un ou plusieurs services, j'ai utilisé ce code:

 beforeEach(function(){
    module('moduleToMock');
    module(function ($provide) {
        $provide.value('yourService', serviceMock);
    });
});
 

Ceci est utile si le service que vous voulez simuler est également un service que vous voulez tester un peu (par une autre description jasmine). La solution proposée par fscof est correcte, mais vous ne pouvez pas créer de test unitaire pour le module angular-table .

47voto

fscof Points 393

Voici ce que j'ai compris:

Je n'étais pas le chargement de tous les 'angulaires-le tableau des" modules dans mon karma.conf.js fichier, d'où l'erreur. C'était intentionnel dans un premier temps que je voulais tester les "événements" module sans la table de module.

J'ai pu facilement moquer de la "angulaires-table' module par la création d'un nouveau fichier dans mon dossier de test appelé "mocks/angular-table.js" et ajouté le code suivant:

/mocks/angular-table.js

'use-strict';
angular.module('angular-table', []);

J'ai ajouté ce fichier sur mon karma.conf.js fichier, avec le véritable "événements" module j'ai voulu tester:

karma.conf.js

...
files = [
    JASMINE,
    JASMINE_ADAPTER,
    'scripts/libs/angular.js',
    'scripts/libs/angular-mocks.js',
    'scripts/events.js', // this is the real module.
    'scripts/mocks/*.js', //loads all custom mocks.
    'scripts/specs/*.spec.js' // loads my spec file.
] 
...

Enfin dans mon fichier spec, j'ai pu ajouter deux modules en appelant les séparément dans un beforeEach bloc:

specs/events.spec.js

beforeEach(function(){
    module('angular-table');
    module('events');
});

J'ai eu l'idée de structurer mes fichiers de cette manière, à partir de ce post

3voto

Emil van Galen Points 66

J'ai récemment publié ngImprovedTesting qui devrait faire de la maquette de test dans AngularJS façon plus facile.

Dans votre cas il suffit d'utiliser la ligne suivante dans votre Jasmin test: beforeEach(ModuleBuilder.forModule ("événements").serviceWithMocks('eventsCtrl').build());

Pour plus d'informations sur ngImprovedTesting découvrez son introduction post de blog: http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X