mardi 26 janvier 2016

Karma: Angular Module Mocking

I am currently trying to write karma unit tests for a controller in an angular app. For me the desired result is to load ONLY the controller which I am testing (assume for now I only ever want to test this one controller) and have all other dependencies mocked out for me.

To set the stage:

  • I have a module: 'XYZ' defined in js/xyz_module.js
  • I have a module: 'ABC' defined in js/abc_module.js
  • module 'ABC' is dependent on 'XYZ'
  • module 'ABC' has a controller: 'AbcController' defined in js/abc_controller.js
  • my testing is to be done ONLY on 'AbcController'

karma.conf.js:

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
        'node_modules/angular/angular.js',
        'node_modules/angular-mocks/angular-mocks.js',
        'js/abc_module.js',
        'js/controllers/abc_controller.js',
        'spec/karma/abc_controller_spec.js'
    ],
...

abc_module.js:

angular.module('ABC', ['XYZ']);

abc_controller.js:

angular.module('ABC').controller('AbcController', ['$scope', function($scope) {
   $scope.letters = ['a', 'b', 'c']
}]);

abc_controller_spec.js:

describe('AbcController', function() {
    beforeEach(function() {
        angular.mock.module('XYZ');
        module('ABC')
    });

    var $controller;
    beforeEach(inject(function(_$controller_) {
        $controller = _$controller_
    }));

    describe('$scope.letters', function() {
        it("is set to three letters", function() {
            var $scope = {};
            $controller('AbcController', {$scope: $scope});
            expect($scope.letters.length).toEqual(3)
        })
    })
});

My theory was that, since module XYZ is a mocked module that I should NOT have to include js/xyz_module.js in my karam.conf.js file, but that the mocking framework would simply mock it for me. Unfortunately this does not seem to be the case. When I run karma I get an error that it cannot find the module 'XYZ'. Is there any way around this? If I have to include all dependencies even to test a portion of an application, it will make it exponentially more difficult with more complex applications. Obviously this is a contrived example and the project I am actually working with involves many modules with many dependencies, making it exceedingly difficult to test portions of it if I have to effectively include the whole application. I thought that was the whole point of mocking? Am I missing something?

Aucun commentaire:

Enregistrer un commentaire