teste jasmine angularjs - O argumento 'PhoneListCtrl' não é uma função, ficou indefinido

StackOverflow https://stackoverflow.com//questions/23045706

  •  21-12-2019
  •  | 
  •  

Pergunta

Ao executar um teste angularjs + Jasmine + Karma, recebi o seguinte erro:enter image description here

Meu script de teste é:

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 é apenas uma cópia do tutorial oficial do AngularJS aqui:http://code.angularjs.org/1.2.0-rc.3/docs/tutorial/step_02

Aqui está parte do meu arquivo 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'
],

O erro é PhoneListCtrl não defino, mas acredito que esteja definido e carregado no código acima.O que você acha que é o problema?Obrigado!

Foi útil?

Solução

A parte de inicialização do módulo está faltando no seu teste de unidade.Você deveria ligar module('phonecatApp') antes de ligar pela primeira vez inject().Seu código de teste de unidade, neste caso, deve ser semelhante a:

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);
    }));
  });
});

onde phonecatApp é o nome do módulo onde você definiu seu PhoneListCtrl controlador.

Além disso, o tutorial que você está usando está desatualizado, é para a versão instável do Angular (1.2.0-rc.3).Aqui está uma versão atualizada do mesmo tutorial para a versão mais recente do Angular: http://docs.angularjs.org/tutorial/step_02

Outras dicas

isso funciona para mim

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');
        }));
    });
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top