sincrona programacion nodejs codigo asincrono asincrona javascript unit-testing asynchronous jasmine

javascript - codigo - programacion asincrona nodejs



¿Cómo probar un método en Jasmine si el código en `beforeEach` es asíncrono? (4)

Al igual que las cosas asíncronas dentro de un it , puedes usar las runs y waitsFor en tu beforeEach:

define( ''Jasmine'' , function () { var data ; beforeEach(function(){ runs( function () { getSomeDataFromRemote(function(res){ data = res; }); }); waitsFor(function () { return !!data; } , ''Timed out'', 1000); }); it("test1", function() { runs( function () { expect(data).toBe(something); }); }); });

Aunque voy a asumir que es porque fue un código de prueba, creo que probablemente deberías tener la llamada getSomeDataFromRemote dentro de tu it ya que eso es lo que estás probando;)

Puede ver algunos ejemplos más grandes en algunas pruebas que he escrito para una API asíncrona aquí: https://github.com/aaronpowell/db.js/blob/f8a1c331a20e14e286e3f21ff8cea8c2e3e57be6/tests/public/specs/open-db.js

Estoy tratando de escribir algunas pruebas con Jasmine, pero ahora tengo un problema si hay algún código que sea asíncrono en beforeEach .

El código de muestra se ve así:

describe("Jasmine", function() { var data ; beforeEach(function(){ console.log(''Before each''); getSomeDataFromRemote(function(res){ data = res; }); }); it("test1", function() { expect(data).toBe(something); console.log(''Test finished''); }); });

Puede ver, antes de beforeEach , quiero obtener algunos datos del control remoto y asignarlos a los data forma asíncrona.

Pero en el test1 , cuando intento verificar:

expect(data).toBe(something);

Los datos undefined están undefined , porque getSomeDataFromRemote aún no ha finalizado.

¿Como arreglarlo?


En este caso, normalmente apago la llamada asíncrona para responder de inmediato.

No estoy seguro de si lo has visto o no, pero aquí hay algo de documentación sobre las pruebas asíncronas con Jasmine.



Jazmín 2.0

Ten cuidado porque en el nuevo Jasmine 2.0 esto va a cambiar y será de estilo moca . beforeEach() utilizar la función done() en beforeEach() y it() . Por ejemplo, imagine que desea probar si una página existe y no está vacía, en un servidor LAMP, utilizando jQuery $.get . Primero debe agregar jQuery al archivo SpecRunner.html , y en su archivo spec.js :

describe(''The "index.php" should'', function() { var pageStatus; var contents; beforeEach(function (done) { $.get(''views/index.php'', function (data, status) { contents = data; pageStatus = status; done(); }).fail(function (object, status) { pageStatus = status; done(); }); }); it(''exist'', function(done) { expect(status).toBe(''success''); done(); }); it(''have content'', function(done) { expect(contents).not.toBe(''''); expect(contents).not.toBe(undefined); done(); }); });

Como puedes ver, pasas la función done() como parámetro para beforeEach() y it() . Cuando ejecute la prueba, it() no se iniciará hasta que se haya llamado a beforeEach() función beforeEach() , por lo que no lanzará las expectativas hasta que beforeEach() la respuesta del servidor.

La pagina existe

Si la página existe, capturamos el estado y los datos de la respuesta del servidor, y llamamos a done() . Luego verificamos si el estado es "exitoso" y si los datos no están vacíos o no están definidos.

La página no existe.

Si la página no existe, capturamos el estado de la respuesta del servidor y llamamos a done() . Luego verificamos si el estado no es "exitoso" y si los datos están vacíos o no están definidos (debe ser porque el archivo no existe).