Подтвердить что ты не робот

Модуль тестирования фазы конфигурации в AngularJS

Я пытаюсь научиться писать модульные тесты для AngularJS. Я начал с самого начала,

angular.module( ... ).config( ... )

Я хочу проверить, что внутри config. Вот как выглядят соответствующие части:

angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData'])

.config([
  '$stateProvider', '$locationProvider',
  function ($stateProvider, $locationProvider) {
    $stateProvider.
      state('login', {
        templateUrl: 'connect.html'
      }).state('addViews', {
        templateUrl: 'add-views.html'
      }).state('dashboard', {
        templateUrl: 'dashboard.html'
      });
    $locationProvider.
      html5Mode(true).
      hashPrefix('!');
  }
]);

Я думаю, что самый простой способ проверить этот код - ввести mocks для $stateProvider и $locationProvider. Затем выполните фазу конфигурации. После этого укажите, как должны выглядеть $stateProvider и $locationProvider.

Если мое мышление правильное, тогда моя проблема заключается в том, что я не знаю, как вводить эти mocks в модуль и выполнять его фазу конфигурации из теста.

Не могли бы вы показать мне, как проверить этот код?

4b9b3361

Ответ 1

Здесь, как получить доступ к вашему провайдеру для модульного тестирования:

describe('yourProvider', function () {
    var provider;

    // Get the provider
    beforeEach(module('app', function (yourProvider) {
        // This callback is only called during instantiation
        provider = yourProvider;
    });

    // Kick off the above function
    beforeEach(inject(function () {}));

    it('does its thing', function () {
        expect(provider.someMethod()).toEqual('your results');
    });
});

Я еще не понял действительно простой способ вставить макет, но вы можете легко подглядывать на методы и что достаточно близко. Если вам нужен макет, возвращаемый поставщиком зависимостей. Метод $get() вы можете сделать это с другим шпионом. Этот пример иллюстрирует возвращение макета и настройку дополнительного шпиона.

describe('yourProvider', function () {
    var dependency, mock, provider;

    beforeEach(module('app', function (dependencyProvider) {
        dependency = dependencyProvider;
        mock = jasmine.createSpyObj('dependency', [
            'methodsGoHere'
        ]);
        spyOn(dependency, 'methodName');
        spyOn(dependency, '$get').andReturn(mock);
    }, function (yourProvider) {
        provider = yourProvider;
    });

    beforeEach(inject(function () {}));

    it('does its thing', function () {
        expect(provider.someMethod()).toEqual('your results');
        expect(dependency.methodName).toHaveBeenCalled();
    });

    it('returns the mock from $get', function () {
        expect(dependency.$get).toBe(mock);
    });
});

Ответ 2

Вы можете использовать Jasmine createSpy и createSpyObj для создания макетных сервисов и angular-mocks.js, чтобы ввести их.

Дополнительные инструкции по инъекциям mocks здесь: Внедрение макета в службу AngularJS

В этот тест, который я написал для моей директивы, вы можете увидеть следующее:

  • Строка 9 Включить angular -mock из google cdn
  • Строка 19 и 20 Создайте поддельный объект rootScope
  • Строка 21 и 22 Создание фальшивой службы q
  • Линия 42 Настройте поставщика, чтобы ввести подделки в службу
  • Строка 48 Мгновенное действие службы, которая имеет подделки (эта служба вводится в тестируемую директиву)
  • Строка 53 Вызовите тестируемый метод
  • Строка 55 - 59 Утверждение о состоянии подделок

Ответ 3

Я бы создал factory, который указывает на функцию... эта функция также вызывается внутри функции config. Таким образом вы можете unit test factory:

angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData']);

// Configuration factory for unit testing
angular.module('ogApp')
.factory('configuration', configuration);

configuration.$inject = ['$stateProvider', '$locationProvider'];

function configuration($stateProvider, $locationProvider) {
  return {
    applyConfig: function () {
      $stateProvider.
        state('login', {
          templateUrl: 'connect.html'
        }).state('addViews', {
          templateUrl: 'add-views.html'
        }).state('dashboard', {
          templateUrl: 'dashboard.html'
        });
      $locationProvider.
        html5Mode(true).
        hashPrefix('!');
    };
}

// Call above configuration function from Angular config phase
angular.module('ogApp')
.config([
  '$stateProvider', '$locationProvider',
  function ($stateProvider, $locationProvider) {
    var config = configuration($stateProvider, $locationProvider);
    config.applyConfig();
  }
]);

Вы можете unit test конфигурацию factory и вводить mocks так же, как и с любым другим factory.