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

4 minutos de lectura

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”?

  • 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

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 es null 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

avatar de usuario
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.

Según Publicación de fantasma en github

  • 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

avatar de usuario
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

avatar de usuario
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');

¿Ha sido útil esta solución?