Как тестировать контроллеры, созданные с помощью 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
Ответы
Ответ 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
});
});
});