Prueba de jasmine angularjs: el argumento 'PhoneListCtrl' no es una función, no está definido
-
21-12-2019 - |
Pregunta
Al ejecutar una prueba de angularjs + Jasmine + Karma, recibí el siguiente error:
Mi script de prueba es:
describe('PhoneCat controllers', function() {
describe('PhoneListCtrl', function(){
it('should create "phones" model with 3 phones', inject(function($controller) {
var scope = {},
ctrl = $controller('PhoneListCtrl', { $scope: scope });
expect(scope.phones.length).toBe(3);
}));
});
});
Este código es solo una copia del tutorial oficial de AngularJS aquí:http://code.angularjs.org/1.2.0-rc.3/docs/tutorial/step_02
Aquí está parte de mi archivo karma.conf.js:
// list of files / patterns to load in the browser
files: [
'js/bower_components/angular/angular.js',
'js/bower_components/angular/ngular-mocks.js',
'js/app/controllers.js',
'test/unit/*.js'
],
El error es ListaTeléfonoCtrl No lo defino, pero creo que está definido y cargado en el código anterior.¿Cuál crees que sea el problema?¡Gracias!
Solución
Falta la parte de inicialización del módulo en la prueba unitaria.Deberías llamar module('phonecatApp')
antes de llamar por primera vez inject()
.Su código de prueba unitaria en este caso debería verse así:
describe('PhoneCat controllers', function() {
describe('PhoneListCtrl', function(){
beforeEach(function() {
module('phonecatApp'); // <= initialize module that should be tested
});
it('should create "phones" model with 3 phones', inject(function($controller) {
var scope = {},
ctrl = $controller('PhoneListCtrl', { $scope: scope });
expect(scope.phones.length).toBe(3);
}));
});
});
dónde phonecatApp
es el nombre del módulo donde definiste tu PhoneListCtrl
controlador.
Además, el tutorial que estás utilizando está desactualizado, es para la versión inestable de Angular (1.2.0-rc.3).Aquí hay una versión actualizada del mismo tutorial para la última versión de Angular: http://docs.angularjs.org/tutorial/step_02
Otros consejos
Esto funciona para mí
describe('addCatControllerTest', function() {
describe('addCatController', function(){
beforeEach(function() {
module('app');
});
beforeEach(inject(function($controller, $rootScope){
$scope = $rootScope.$new();
}));
it('Add Cat Controller test', inject(function($controller) {
var scope = {},
ctrl = $controller('addCatController', { $scope: scope });
expect(scope.title).toBe('Add Cat');
}));
});
});