(Há uma questão relacionada aqui: o teste Jasmine não vê o módulo AngularJS )
Eu só quero testar um serviço sem inicializar o Angular.
Eu vi alguns exemplos e o tutorial, mas não vou a lugar nenhum.
Tenho apenas três arquivos:
myService.js: onde eu defino um serviço AngularJS
test_myService.js: onde eu defino um teste Jasmine para o serviço.
specRunner.html: um arquivo HTML com a configuração normal do jasmine e onde eu importo os outros dois arquivos anteriores e o Jasmine, Angularjs e angular-mocks.js.
Este é o código do serviço (que funciona conforme o esperado quando não estou testando):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Como estou tentando testar o serviço isoladamente, devo conseguir acessá-lo e verificar seus métodos. Minha pergunta é: como posso injetar o serviço em meu teste sem inicializar o AngularJS?
Por exemplo, como posso testar o valor retornado para um método do serviço com Jasmine assim:
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
no caso de muitos ... muitos ... muitos testes sendo necessários para o serviço? Testando um modelo de dados (serviço) e ele contém uma tonelada de variáveis globais. Obrigado, C§Embora a resposta acima provavelmente funcione bem (não tentei :)), geralmente tenho muito mais testes para executar, então não os injeto. Vou agrupar os casos it () em blocos de descrição e executar minha injeção em um beforeEach () ou beforeAll () em cada bloco de descrição.
Robert também está correto ao dizer que você deve usar o injetor Angular $ para fazer os testes cientes do serviço ou da fábrica. O Angular também usa esse injetor em seus aplicativos para informar ao aplicativo o que está disponível. No entanto, ele pode ser chamado em mais de um lugar e também pode ser chamado implicitamente em vez de explicitamente. Você notará em meu arquivo de teste de especificação de exemplo abaixo, o bloco beforeEach () chama implicitamente o injetor para tornar as coisas disponíveis para serem atribuídas dentro dos testes.
Voltando ao agrupamento de coisas e ao uso de blocos anteriores, aqui está um pequeno exemplo. Estou fazendo um serviço Cat e quero testá-lo, então minha configuração simples para escrever e testar o serviço ficaria assim:
app.js
Especificação: controlador de gatos
Especificações: Serviço de gatos
EDITAR Com base em alguns dos comentários, atualizei minha resposta para ser um pouco mais complexa e também criei um Plunkr demonstrando os testes de unidade. Especificamente, um dos comentários mencionou "E se um serviço do controlador tiver uma dependência simples, como $ log?" - que está incluído no exemplo com casos de teste. Espero que ajude! Teste ou hackear o planeta !!!
https://embed.plnkr.co/aSPHnr/
fonte
Eu precisava testar uma diretiva que exigia outra diretiva, Google Places Autocomplete , estava debatendo se deveria apenas simular ... de qualquer forma, isso funcionou sem lançar quaisquer erros para a diretiva que exigia gPlacesAutocomplete.
fonte
Se você quiser testar um controlador, pode injetá-lo e testá-lo conforme abaixo.
fonte