Mocking de dependencies de módulo angular em testes de unidade Jasmine

Eu estou tentando unidade de código do controlador de teste dentro de um módulo que leva outros módulos como dependencies, mas não consegui descobrir como zombar deles corretamente.

Estou usando o Jasmine Framework e executando meus testes com o Karma (Testacular).

Código do Módulo

var app = angular.module('events', ['af.widgets', 'angular-table']); app.controller('eventsCtrl', function([dependencies]){ $scope.events = []; ... }); 

Código de Especificação

 describe('events module', function(){ var $scope, ctrl; beforeEach(function(){ angular.mock.module('af.widgets', []); angular.mock.module('angular-table', []); module('events', ['af.widgets', 'angular-table']); }); beforeEach(inject(function($rootScope, $controller){ $scope = $rootScope.new(); ctrl = $controller('NameCtrl', { $scope: $scope, }); })); it('should have an empty events array', function(){ expect($scope.events).toBe([]); }) }); 

O erro que estou recebendo é o Karma é “no módulo af.widgets”, então obviamente eu não estou mocking das dependencies do módulo. Alguma dica?

Se você quiser zombar de um módulo que declara um ou mais serviços, usei este código:

 beforeEach(function(){ module('moduleToMock'); module(function ($provide) { $provide.value('yourService', serviceMock); }); }); 

Isso é útil se o serviço que você quer simular também é um serviço que você deseja testar na unidade (em outro jasmine, descreva). A solução proposta pelo fscof é boa, mas você não pode criar um teste de unidade para o módulo de angular-table .

Aqui está o que eu descobri:

Eu não estava carregando nenhum módulo de ‘tabela angular’ no meu arquivo karma.conf.js, daí o erro. Isso foi intencional no começo, já que eu queria testar o módulo ‘events’ sem o módulo de tabela real.

Eu era capaz de facilmente zombar do módulo ‘tabela angular’ criando um novo arquivo na minha pasta de teste chamado ‘mocks / angular-table.js’ e adicionei o seguinte código:

/mocks/angular-table.js

 'use-strict'; angular.module('angular-table', []); 

Eu adicionei este arquivo ao meu arquivo karma.conf.js, juntamente com o módulo ‘events’ real que eu queria testar:

karma.conf.js

 ... files = [ JASMINE, JASMINE_ADAPTER, 'scripts/libs/angular.js', 'scripts/libs/angular-mocks.js', 'scripts/events.js', // this is the real module. 'scripts/mocks/*.js', //loads all custom mocks. 'scripts/specs/*.spec.js' // loads my spec file. ] ... 

Finalmente, no meu arquivo de especificações, consegui adicionar os dois módulos chamando-os separadamente em um bloco beforeEach:

specs / events.spec.js

 beforeEach(function(){ module('angular-table'); module('events'); }); 

Eu tive a ideia de estruturar meus arquivos desta forma a partir deste post

Recentemente, lancei o ngImprovedTesting, que deve facilitar o teste simulado no AngularJS.

No seu caso, basta usar o seguinte no seu teste Jasmine:

 beforeEach(ModuleBuilder.forModule('events').serviceWithMocks('eventsCtrl').build()); 

Para obter mais informações sobre o ngImprovedTesting, consulte a postagem do blog introdutório: http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/