tutorial test run princess karma javascript jasmine

javascript - test - karma js



¿Jasmine está antes de cada uno sincrónico? (1)

Sí, todo antes. beforeEach s se ejecutará en el orden que usted defina.

Si exploras Jasmine, finalmente llegas a esta definición :

Suite.prototype.beforeEach = function(fn) { this.beforeFns.unshift(fn); };

A medida que agrega describe s, Suite se genera y anida. Cada Suite se inicializa con this.beforeFns = [] , que se agrega como puede ver. Tenga en cuenta que el unshift agrega al lado izquierdo de la matriz, por lo que esperaría que se definiera más tarde antes de que beforeEach una se ejecute primero. Esto se resuelve más tarde cuando Jasmine se acerca a los padres de la suite de beforeEach , reúne todas beforeEach listas anteriores y luego las invierte para ejecutarlas en el orden que desee.

var beforeAndAfterFns = function(suite) { return function() { var befores = [], afters = []; while(suite) { befores = befores.concat(suite.beforeFns); afters = afters.concat(suite.afterFns); suite = suite.parentSuite; } return { befores: befores.reverse(), afters: afters }; }; };

Como señala Dan , hasta ahora hemos supuesto que todos sus beforeEach son sincrónicos. A partir de Jasmine 2, puede configurar asincrónico beforeEach s así:

beforeEach(function(done) { setTimeout(function() { console.log(''Async''); done(); }, 1000) });

En el tiempo de ejecución, Jasmine le envía la función completada y se ejecuta de forma asincrónica si su función toma un argumento . ( Function.length devuelve la cantidad de argumentos que espera la función).

for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) { var queueableFn = queueableFns[iterativeIndex]; if (queueableFn.fn.length > 0) { attemptAsync(queueableFn); return; } else { attemptSync(queueableFn); } }

attemptAsync espera que usted llame a done() antes de que QueueRunner pase a la siguiente beforeEach enganche, por lo que el orden sigue funcionando! Con buena pinta.

describe(''beforeEach'', function() { var data = null; beforeEach(function() { data = []; }); beforeEach(function() { data.push(1); }); beforeEach(function(done) { setTimeout(function() { data.push(''Async''); done(); }, 1000); }); beforeEach(function() { data.push(2); }); beforeEach(function() { data.push(3); }); it(''runs in order'', function(){ expect(data).toEqual([1, ''Async'', 2, 3]); }); });

Si tiene múltiples beforeEach ''s, ¿siempre se ejecutarán uno tras otro?

beforeEach(function() {}); beforeEach(function() {}); beforeEach(function() {}); beforeEach(function() {}); beforeEach(function() {});

Parece que lo harán. Intenté probarlo con mi código:

describe(''Directive: Statement'', function() { var el, scope, statements; beforeEach(module(''simulatedSelves'')); beforeEach(module(''templates'')); beforeEach(inject(function($compile, $rootScope) { console.log(1); scope = $rootScope.$new(); statements = []; scope.statement = { text: ''test'', arr: [] }; scope.statement.parent = statements; statements.push(scope.statement); el = angular.element(''<statement statement=statement></statement>''); $compile(el)(scope); scope.$digest(); })); beforeEach(function() { var counter = 0; console.log(2); for (var i = 0; i < 1000000; i++) { counter++; } console.log(counter); }); beforeEach(function() { console.log(3); }); it(''test statement has correct properties'', function() { // stuff }); });

Registra:

1 2 1000000 3

Dado que el beforeEach con el bucle long for registra sus cosas antes que la que registra 3 , creo que el beforeEach ejecuta de forma síncrona. ¿Es eso cierto?