Chai: cómo probar indefinido con la sintaxis 'debería'

95

Sobre la base de este tutorial que prueba una aplicación angularjs con chai, quiero agregar una prueba para un valor indefinido usando el estilo "should". Esto falla:

it ('cannot play outside the board', function() {
  scope.play(10).should.be.undefined;
});

con el error "TypeError: No se puede leer la propiedad 'should' de undefined", pero la prueba pasa con el estilo "esperado":

it ('cannot play outside the board', function() {
  chai.expect(scope.play(10)).to.be.undefined;
});

¿Cómo puedo hacer que funcione con "debería"?

el benedicto
fuente
1
Es fácil si usa "afirmar", puede hacerlo comoassert.isUndefined(scope.play(10))
lukaserat

Respuestas:

80

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 para mantener la propiedad.

La documentación ofrece 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');
});
David Norman
fuente
14
should.not.existvalidará si el valor es nullasí que esta respuesta no es correcta. @ Daniel tiene la respuesta a continuación: should.equal(testedValue, undefined);. Esa debería ser la respuesta aceptada.
Sebastian
7
Llego a esta respuesta (no a los documentos 🙈) mensualmente :-)
Ralph Cowling
52
should.equal(testedValue, undefined);

como se menciona en la documentación de chai

daniel
fuente
12
Dios mío, ¿qué hay que explicar? Espera testeValue === indefinido, así que lo prueba. Muchos desarrolladores primero ponen testValue primero y luego lo encadenan con should y termina con un error ...
Daniel
5
Esto no funciona de inmediato 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 función que acepta dos argumentos, en lugar de la forma de método encadenado esperado que acepta un solo argumento para el valor esperado. Solo puede lograr esto importando / solicitando y asignando una versión invocada de .should()como se describe en la respuesta aceptada por @DavidNorman y en esta documentación .
Gfullam
Creo que encontrará que esa .equalsintaxis produce mensajes de error mucho mejores porque le permite generar mensajes que son más descriptivos cuando las cosas fallan
jcollum
17

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 falsedad, es decir, tratada como falsa en condiciones

var should = require('should');
...
should(scope.play(10)).not.be.ok;
Peter Dotchev
fuente
No es especialmente útil o intuitivo, ¡pero eso es inteligente!
thebenedict
2
¿Inútil? Es la mejor respuesta para pruebas indefinidas en IMO de estilo bdd, sin embargo, necesita instalar otro paquete npm (el paquete debería), y no creo que valga la pena instalar otro paquete solo por eso, sin embargo, una respuesta increíble
Wagner Leonardi
16
(typeof scope.play(10)).should.equal('undefined');
teddychan
fuente
8

Luché para escribir la declaración should 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 de si lo anterior es la forma correcta, pero funciona.

Según Post de ghost en github

Viraths
fuente
1
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 está terminando las líneas con un punto y coma).
bmacnaughton
5

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
});
EpokK
fuente
Gracias, pero eso es lo que estoy haciendo en el segundo intento anterior. Me gustaría entender cómo hacerlo con la sintaxis should .
thebenedict
1

La respuesta de @ david-norman es correcta según la documentación, tuve algunos problemas con la configuración y en su lugar opté por lo siguiente.

(typeof scope.play (10)). should.be.undefined;

Andy Polhill
fuente
typeofel operador devuelve una cadena ; por lo que esta afirmación no se pudo aprobar; cuz'undefined' !== undefined
dNitro
1

No se olvide de una combinación de havey notpalabras clave:

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');
Yarovoy
fuente
0

Puede ajustar el resultado de su función should()y probar un tipo de "indefinido":

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
pegli
fuente