web-dev-qa-db-fra.com

Chai: comment tester non défini avec la syntaxe 'devrait'

S'appuyant sur this tutoriel pour tester une application angularjs avec chai, je souhaite ajouter un test pour une valeur non définie en utilisant le style "devrait". Cela échoue:

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

avec l'erreur "TypeError: impossible de lire la propriété 'devrait' ou 'non défini", mais le test réussit avec le style "expect":

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

Comment puis-je le faire fonctionner avec "devrait"?

91
thebenedict

C'est l'un des inconvénients de la syntaxe should. Cela fonctionne en ajoutant la propriété should à tous les objets, mais si une valeur de retour ou une valeur de variable n'est pas définie, il n'y a pas d'objet pour contenir la propriété.

Le documentation donne quelques solutions, par exemple:

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});
75
David Norman
should.equal(testedValue, undefined);

comme mentionné dans la documentation chai

46
daniel

Test pour indéfini

var should = require('should');
...
should(scope.play(10)).be.undefined;

Test pour null

var should = require('should');
...
should(scope.play(10)).be.null;

Test de falsification, c'est-à-dire traité comme faux dans des conditions

var should = require('should');
...
should(scope.play(10)).not.be.ok;
17
Peter Dotchev
(typeof scope.play(10)).should.equal('undefined');
16
teddychan

J'ai eu du mal à écrire l'instruction should pour des tests non définis. Ce qui suit ne fonctionne pas.

target.should.be.undefined();

J'ai trouvé les solutions suivantes.

(target === undefined).should.be.true()

si peut aussi l'écrire comme vérification de type

(typeof target).should.be.equal('undefined');

Je ne sais pas si ce qui précède est la bonne façon, mais cela fonctionne.

Selon Post de fantôme dans github

7
Viraths

Essaye ça:

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
});
5
EpokK

La réponse de @ david-norman est correcte, conformément à la documentation. J'ai eu quelques problèmes d'installation et j'ai opté pour la suivante.

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

1
Andy Polhill

N'oubliez pas une combinaison de mots-clés have et not:

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

Vous pouvez envelopper votre résultat de fonction dans should() et tester un type "non défini":

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