test run karma javascript testing jasmine dry

javascript - run - ¿Cómo reutilizar beforeEach/afterEach en Jasmine JS?



run jasmine test (4)

Al escribir pruebas con JasmineJS tengo muchas pruebas que tienen un código similar antes de cada uno / después de cada.

¿Hay alguna manera de implementar un modelo de herencia usando las suites de prueba JasmineJS?

Puedo agrupar todas las pruebas en una sola describe pero en este caso terminaré con un solo archivo JS ENORME que contiene todas las pruebas.

Me gustaría dividir las pruebas para cada página.

Aquí hay un ejemplo:

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


Creo que esto se examina parcialmente en esta publicación de blog y también se responde aquí, pero estoy agregando una respuesta adaptada para su ejemplo:

Código reutilizable:

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

Cómo usarlo:

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


Jasmine te permite poner beforeEach afterEach beforeEach y después de afterEach fuera de una llamada de describe . De esta forma, puede configurar y desmontar de manera global todas sus especificaciones. Su llamada de logout() parece que podría ser un buen candidato para el desmontaje global, y si todas sus especificaciones inician sesión como administrador, también podría moverlo al alcance global.

Para cosas que se usan en algunas, pero no en todas, las especificaciones, tener un método como login_as_admin() parece ser la mejor manera de consolidar esa lógica en un solo lugar.


Referencia: ( Blog de Pivotal Labs: Davis W. Frank )

Describe la recopilación de funcionalidad compartida en una función que se llama con parámetros para las diferentes suites individuales. Llamar a esta función dentro de cada suite ejecutará la configuración / configuración común.

En cuanto a dividir las pruebas entre los archivos; el archivo con la función compartida puede incluirse dentro de cada página con una etiqueta <script> si las pruebas están basadas en el navegador, o por un require(...) cerca de la parte superior si las pruebas están basadas en nodos. A continuación, puede ejecutar las pruebas de forma independiente pero utilizando esa configuración compartida que se define solo una vez.


Si desea hacer esto para todas sus suites, puede registrar una función beforeEach o afterEach en el topSuite :

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

Si solo desea aplicarlo en algunas suites, puede trabajar con sub-suites:

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