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.
Tengo un artículo detallado que describe cómo probar funciones de javascript asíncronas utilizando Jasmine: http://www.larsavery.com/blog/how-to-test-asynchronous-javascript-functions-using-jasmine/
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).