Como reutilizar beforeEach / afterEach em Jasmine JS?

Ao escrever testes com JasmineJS eu tenho muitos testes que têm código beforeEach / afterEach similar.

Existe uma maneira de implementar um modelo de inheritance usando suítes de teste JasmineJS?

Eu posso agrupar todos os testes em uma única describe mas neste caso, terminarei com um único arquivo HUGE JS contendo todos os testes.

Eu gostaria de dividir os testes para cada página.

Aqui está um exemplo:

 describe('Services Page', function() { beforeEach(function() { login_as_admin() }) beforeEach(function() { browser().navigateTo('/services') }) if('Some test for services page', function() {}) afterEach(function() { logout() }) }) describe('Administrators Page', function() { beforeEach(function() { login_as_admin() }) beforeEach(function() { browser().navigateTo('/administrators') }) if('Some test for administrators page', function() {}) afterEach(function() { logout() }) }) 

Eu acho que isso é parcialmente examinado neste post do blog e também respondi aqui, mas estou adicionando uma resposta adaptada para o seu exemplo:

Código reutilizável:

 function sharedSetup(startPage) { beforeEach(function() { login_as_admin(); browser().navigateTo(startPage); }); afterEach(function() { logout(); }); }; 

Como usá-lo:

 describe('Services Page', function() { sharedSetup('/services'); it('Some test for services page', function() {}); }); describe('Administrators Page', function() { sharedSetup('/administrators'); it('Some test for administrators page', function() {}); }); 

Se você quiser fazer isso para todas as suas suítes, você pode registrar uma function afterEach ou afterEach no topSuite :

 jasmine.getEnv().topSuite().beforeEach({fn: function() { //log in as admin }}); 

Se você quiser aplicá-lo apenas em algumas suítes, poderá trabalhar com sub-suítes:

 describe("as_admin", function() { beforeEach(function() { //log in as admin }); describe('Services Page',function() {...}); describe('Administrators Page',function() {...}); } 

Jasmine permite que você coloque beforeEach e afterEach de uma chamada de describe . Desta forma, você pode ter configuração e desassembly que é global para todas as suas especificações. Sua chamada de logout() parece ser um bom candidato para desassembly global e, se todas as suas especificações fizerem login como administrador, você também poderá transferi-la para o escopo global.

Para coisas que são usadas em algumas, mas não em todas, especificações, ter um método como seu login_as_admin() parece ser a melhor maneira de consolidar essa lógica em um só lugar.

Referência: ( Pivotal Labs Blog: Davis W. Frank )

Ele descreve a coleta de funcionalidade compartilhada em uma function que é chamada com parâmetros para os diferentes conjuntos individuais. Chamar essa function em cada suíte executará a configuração / configuração comum.

Quanto à divisão de testes entre arquivos; o arquivo com a function compartilhada pode ser incluído em cada página com uma tag se os testes forem baseados em navegador ou por um require(...) próximo ao topo se os testes forem baseados em nó. Você pode então executar os testes de forma independente, mas usando essa configuração compartilhada que é definida apenas uma vez.

Intereting Posts