1
resposta

Injetando controllers, services e afins

Estou começando a utilizar o Karma para testes no AngularJS, configurei o meu arquivo de teste, porém, quando estou começando a utilizar ele encontrei um problema que empaquei, que foi na injeção da classe que quero testar:

  • TypeError: undefined is not an object (evaluating '$scope.excluirCorporacao(corporacaoData.id)

no caso as partes importantes do meu spec.js são essas:

 beforeEach(inject(function(_$rootScope_, _$controller_, _servicoConstants_, _servicoCorporacoes_) {
        $controller = _$controller_;
        constants = _servicoConstants_;
        servicosCorporacao = _servicoCorporacoes_;
    }));

beforeEach(function() {
        $scope = {};
        corporacaoData = {
            id: 8,
            nome: 'Ninja das Colinas',
            status: 'Ativada e pronto pro combate',
            plano: 3,
            limiteUsuarios: 50
        };
        controller = $controller('modalCorporacao', {
            $scope: $scope,
            corporacao: corporacaoData,
            servicosCorporacao: servicosCorporacao
        });
    });

    it('#deve verificar se o serviço de exclusão de corporação foi definido', function() {
        expect(servicosCorporacao.excluirCorporacao).toBeDefined();
    });

    describe('manipular dados da corporacao', function() {
        it("#deve excluir uma corporacao, caso ela seja selecionada", function() {
            $scope.excluirCorporacao(corporacaoData.id)
                .then(function() {
                    expect($scope.mensagemErro.length).toBe(0);
                    done();
                }).catch(function(e) {
                    console.log("errou")
                    done.fail(e);
                });
        });
    });
})

No caso a ideia seria acessar essa clase de exclusão dentro do meu controller.

1 resposta

Oi Matheus, tudo bem? Confesso que estou confuso, por hora, acredito que você não possa acessar o scope por que ele está dentro da função passada para o beforeEach, você não tem esse valor globalmente.

Se verificarmos a documentação do Angular que descreve como testar o controller, verá que ele sempre cria o scope dentro do próprio teste: https://docs.angularjs.org/guide/unit-testing#testing-a-controller

Para funcionar, talvez você precise definir o scope e $controller no escopo global do arquivo e sobrescrever o valor dele dentro do beforeEach.