Sobre la base de este tutorial probando una aplicación angularjs con chai, quiero agregar una prueba para un valor indefinido usando el estilo “debería”. Esto falla:
it ('cannot play outside the board', function() {
scope.play(10).should.be.undefined;
});
con el error “Error de tipo: no se puede leer la propiedad ‘debería’ de indefinido”, pero la prueba pasa con el estilo “esperar”:
it ('cannot play outside the board', function() {
chai.expect(scope.play(10)).to.be.undefined;
});
¿Cómo puedo hacer que funcione con “debería”?
Esta es una de las desventajas de la sintaxis should. Funciona agregando la propiedad should a todos los objetos, pero si un valor de retorno o un valor de variable no está definido, no hay un objeto que contenga la propiedad.
los documentación da algunas soluciones, por ejemplo:
var should = require('chai').should();
db.get(1234, function (err, doc) {
should.not.exist(err);
should.exist(doc);
doc.should.be.an('object');
});
-
should.not.exist
validará si el valor esnull
por lo que esta respuesta no es correcta. @daniel tiene la respuesta a continuación:should.equal(testedValue, undefined);
. Esa debería ser la respuesta aceptada.– Sebastián
23 de abril de 2015 a las 18:02
-
Llego a esta respuesta (no a los documentos 🙈) mensualmente 🙂
-Ralph Cowling
23 de noviembre de 2016 a las 7:24
should.equal(testedValue, undefined);
como se menciona en la documentación chai
-
Dios mío, ¿qué hay que explicar? Esperas que el valor probado sea === indefinido, así que lo pruebas. Muchos desarrolladores primero ponen testingValue primero y luego lo encadenan con should y termina con un error…
– Daniel
21 de mayo de 2014 a las 14:02
-
Esto no funciona fuera de la caja y no se encuentra en la documentación de la API para
.equal()
. Puedo entender por qué @OurManInBananas pidió una explicación. Es un uso inesperado de should como una función que acepta dos argumentos, en lugar del método encadenado esperado que acepta un solo argumento para el valor esperado. Solo puede lograr esto importando/requiriendo y asignando una versión invocada de.should()
como se describe en la respuesta aceptada por @DavidNorman y en este documentación.– gfullam
30/09/2016 a las 13:00
-
Creo que encontrarás que eso
.equal
la sintaxis produce mensajes de error mucho mejores porque le permite generar mensajes que son más descriptivos cuando las cosas fallan– jcollum
10 de noviembre de 2016 a las 16:57
teddy-chan
(typeof scope.play(10)).should.equal('undefined');
Prueba para indefinido
var should = require('should');
...
should(scope.play(10)).be.undefined;
Prueba de nulo
var should = require('should');
...
should(scope.play(10)).be.null;
Prueba de falso, es decir, tratado como falso en condiciones
var should = require('should');
...
should(scope.play(10)).not.be.ok;
Luché para escribir la declaración debería para pruebas indefinidas. Lo siguiente no funciona.
target.should.be.undefined();
Encontré las siguientes soluciones.
(target === undefined).should.be.true()
si también puede escribirlo como una verificación de tipo
(typeof target).should.be.equal('undefined');
No estoy seguro si lo anterior es la forma correcta, pero funciona.
-
Vale la pena señalar que el uso de esta sintaxis puede hacer que JavaScript interprete la expresión entre paréntesis como un intento de invocar la línea anterior como una función (si no termina las líneas con un punto y coma).
– bmacnaughton
13 de febrero de 2018 a las 18:20
EpokK
Prueba esto:
it ('cannot play outside the board', function() {
expect(scope.play(10)).to.be.undefined; // undefined
expect(scope.play(10)).to.not.be.undefined; // or not
});
-
Vale la pena señalar que el uso de esta sintaxis puede hacer que JavaScript interprete la expresión entre paréntesis como un intento de invocar la línea anterior como una función (si no termina las líneas con un punto y coma).
– bmacnaughton
13 de febrero de 2018 a las 18:20
Yarovoy
No te olvides de una combinación de have
y not
palabras clave:
const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');
Es fácil si usará “afirmar”, puede hacerlo como
assert.isUndefined(scope.play(10))
– lukaserat
15 de noviembre de 2016 a las 8:14
No me gusta ninguna de las respuestas aquí, así que fui con solo usar
expect
para cheques indefinidos,should
para todo lo demás 🤷– Kip
3 de febrero a las 16:06