Отказывание зависимостей модулей Angular в модульных тестах Jasmine

Я пытаюсь выполнить код unit test контроллера внутри модуля, который использует другие модули в качестве зависимостей, но не смог выяснить, как правильно их имитировать.

Я использую Jasmine Framework и запускаю свои тесты с помощью Karma (Testacular).

Код модуля

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

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

Код спецификации

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([]);
    })
});

Ошибка, которую я получаю, это "нет модуля af.widgets", поэтому, очевидно, я не издеваюсь над зависимостями модулей. Любые намеки?

Ответ 1

Если вы хотите высмеять модуль, объявляющий одну или несколько служб, я использовал этот код:

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

Это полезно, если служба, которую вы хотите высмеять, также является сервисом, который вы хотите использовать unit test (в другом описании жасмина). Решение, предложенное fscof, отлично, но вы не можете создать unit test для модуля angular-table.

Ответ 2

Вот что я понял:

Я не загружал модули 'angular -table' в файл karma.conf.js, поэтому ошибка. Сначала это было намеренно, поскольку я хотел протестировать модуль "событий" без фактического табличного модуля.

Мне удалось легко высмеять модуль angular -table ', создав новый файл в тестовой папке с именем "mocks/angular -table.js" и добавил следующий код:

/насмехающийся/angular -table.js

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

Я добавил этот файл в свой файл karma.conf.js вместе с модулем реальных событий, который я хотел проверить:

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.
] 
...

Наконец, в моем файле spec я смог добавить оба модуля, вызвав их отдельно в блоке beforeEach:

specs/events.spec.js

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

У меня возникла идея структурировать мои файлы таким образом из этого сообщения

Ответ 3

Недавно я выпустил ngImprovedTesting, который должен сделать макетное тестирование в режиме AngularJS проще.

В вашем случае просто используйте следующее в своем тесте Жасмин: beforeEach (ModuleBuilder.forModule( 'события') serviceWithMocks ( 'eventsCtrl') построить().).

Для получения дополнительной информации о ngImprovedTesting ознакомьтесь со своим вступительным сообщением в блоге: http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/