Как тестировать контроллеры, созданные с помощью angular.module(). controller() в angular.js, используя Mocha - программирование
Подтвердить что ты не робот

Как тестировать контроллеры, созданные с помощью angular.module(). controller() в angular.js, используя Mocha

У меня есть контроллер, созданный с помощью angular.module(). controller(), как в этой ситуации

myModule = angular.module('myApp.controllers', [])
                   .controller('testCtrl', ['$scope', function($scope){
                           $scope.test = 'this is a test';
                    }]);

Теперь мне нужно использовать mocha для проверки правильности работы моего контроллера. В Angular есть несколько примеров, когда контроллеры объявляются глобальными функциями (например, http://docs.angularjs.org/tutorial/step_04), поэтому они используют

function PhoneListCtrl() {...}
.....
beforeEach(function() {
   scope = {},
   ctrl = new PhoneListCtrl(scope);
});

it('shod test whatever PhoneListCtrl does ', function() {
   expect(scope.someProp).toBe('whateverValue');
});    

так что вопросы:

1) как я могу выполнить аналогичный тест для контроллеров, объявленных с помощью angular.module(). controller()

2), как это сделать, используя Mocha

4b9b3361

Ответ 1

AngularJS предоставляет макеты, которые предоставляют некоторые полезные функции для инъекции зависимостей во время тестирования.

Пример:

(в жасмине)

Скажем, мы хотим выполнить первый тест из официального официального учебника, и мы определили модуль контроллеров. (вы можете пропустить имя модуля, но я хочу, чтобы это было просто)

var Controllers = angular.module('controllers', []);

Controllers.controller('PhoneListCtrl', ['$scope', function($scope){
    $scope.phones = [{name: "Nexus S", snippet: "Fast..."},
                     {name: "Motorola XOOM...", snippet: "The Next...."},
                     {name: "MOTOROLA XOOM...", snippet: "The Next, Next..."}];
}]);

Затем мы создаем модуль для приложения и вводим его в наш модуль контроллеров

var PhonesApp = angular.module('phoneApp', ['controllers']);

Наконец, мы можем протестировать его так:

describe('phonesApp', function() {
    describe('phoneApp controllers', function() {
        beforeEach(module('controllers'));
        describe('PhoneListCtrl', function() {
            it('should create "phones" model with 3 phones',
                inject(function($rootScope, $controller) {

                var scope = $rootScope.$new();
                var ctrl = $controller("PhoneListCtrl", {$scope: scope });
                expect(scope.phones.length).toBe(3);
            }));
        });
    });
});

Я не делал этого в мокко, но я думаю, что процесс похож.

Pd: я сделал учебник с использованием CoffeeScript, вот соответствующие бит https://gist.github.com/4163147

Ответ 2

Если вы используете mocha, будьте осторожны, если нет поддержки для angular.mock.module или angular.mock.inject, если вы не обновили до angular -1.1.1. Я нахожусь в одной лодке, но я не могу обновиться из-за другой проблемы.

Я хочу использовать mocha, потому что мои тесты на стороне сервера в мокко, и я бы предпочел иметь одну и ту же тестовую структуру с обеих сторон, поэтому у меня немного рассол.

Итак, если вы не можете использовать инъекцию/модуль, вы можете попробовать его следующим образом:

var $injector = angular.injector(['your-app-name', 'ng']),
  $controller = $injector.get('$controller'),
  $scope = $injector.get('$rootScope');

describe('my app controllers', function () {
  describe('FooCtrl', function () {
     it('should do something', function () {
        // scope can be any object you want; could be $rootScope from above
        var params = { $scope: { } },
          ctrl = $controller('FooCtrl', params);
        // TODO: test ctrl
     });
  });
});