unit-testing - tutorial - run test angular
cómo probar controladores creados con angular.module(). controller() en Angular.js usando Mocha (2)
Tengo un controlador creado con angular.module (). Controller () como en esta situación
myModule = angular.module(''myApp.controllers'', [])
.controller(''testCtrl'', [''$scope'', function($scope){
$scope.test = ''this is a test'';
}]);
ahora, necesito usar mocha para probar si mi controlador está funcionando correctamente. En Angular hay algunos ejemplos cuando los controladores se declaran como funciones globales (por ejemplo, http://docs.angularjs.org/tutorial/step_04 ), por lo que usan
function PhoneListCtrl() {...}
.....
beforeEach(function() {
scope = {},
ctrl = new PhoneListCtrl(scope);
});
it(''shod test whatever PhoneListCtrl does '', function() {
expect(scope.someProp).toBe(''whateverValue'');
});
Así que las preguntas son:
1) ¿cómo puedo hacer una prueba similar para los controladores que se declaran usando angular.module (). Controller ()
2) Como hacerlo utilizando Mocha.
AngularJS proporciona simulacros que ponen a disposición algunas funciones útiles para la inyección de dependencia durante la prueba.
Ejemplo:
(en jazmín)
Digamos que queremos realizar la primera prueba del tutorial oficial y hemos definido un módulo de controladores. (podría nombrar el nombre del módulo, pero quiero que sea sencillo)
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..."}];
}]);
Luego creamos un módulo para nuestra aplicación y le inyectamos nuestro módulo de controladores.
var PhonesApp = angular.module(''phoneApp'', [''controllers'']);
Finalmente podemos probarlo así.
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);
}));
});
});
});
No lo he hecho en mocha, pero creo que el proceso es similar.
Pd: Hice el tutorial usando CoffeeScript, aquí están los bits relevantes https://gist.github.com/4163147
Si está utilizando mocha, tenga en cuenta que no hay soporte para angular.mock.module
o angular.mock.inject
menos que haya actualizado a angular-1.1.1. Estoy en el mismo barco, pero no puedo mejorar por otro problema.
Quiero usar mocha, porque mis pruebas del lado del servidor están en mocha, y prefiero tener el mismo marco de prueba en ambos lados, así que estoy en un poco de un lío.
Por lo tanto, si no puede usar inyectar / módulo, puede intentarlo de esta manera:
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
});
});
});