Chai: come testare undefined con la sintassi "should"


95

Basandomi su questo tutorial che prova un'app angularjs con chai, voglio aggiungere un test per un valore indefinito usando lo stile "should". Questo fallisce:

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

con errore "TypeError: Impossibile leggere la proprietà 'should' di undefined", ma il test viene superato con lo stile "previsto":

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

Come posso farlo funzionare con "dovrebbe"?


1
È facile se usi "assert", puoi farlo comeassert.isUndefined(scope.play(10))
lukaserat

Risposte:


80

Questo è uno degli svantaggi della sintassi dovrebbe. Funziona aggiungendo la proprietà should a tutti gli oggetti, ma se un valore restituito o un valore variabile non è definito, non c'è un oggetto per contenere la proprietà.

La documentazione fornisce alcune soluzioni alternative, ad esempio:

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

14
should.not.existconvaliderà se il valore è nullcosì questa risposta non è corretta. @ Daniel ha la risposta qui sotto: should.equal(testedValue, undefined);. Questa dovrebbe essere la risposta accettata.
Sebastian

7
Vengo a questa risposta (non ai documenti 🙈) su base mensile :-)
Ralph Cowling

52
should.equal(testedValue, undefined);

come menzionato nella documentazione chai


12
omg, cosa c'è da spiegare? Ti aspetti testato su === undefined, quindi lo provi. Molti sviluppatori hanno prima messo prima testValue e poi incatenato con should e finisce con un errore ...
daniel

5
Questo non funziona immediatamente e non si trova nella documentazione API per.equal() . Posso capire perché @OurManInBananas ha chiesto una spiegazione. È un uso inaspettato di dovrebbe come funzione che accetta due argomenti, invece del metodo concatenato previsto che accetta un singolo argomento per il valore atteso. Puoi ottenere ciò solo importando / richiedendo e assegnando una versione invocata di .should()come descritto nella risposta accettata di @DavidNorman e in questa documentazione .
gfullam

Penso che scoprirai che quella .equalsintassi produce messaggi di errore molto migliori perché ti consente di produrre messaggi più descrittivi quando le cose falliscono
jcollum

17

Prova per undefined

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

Prova per null

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

Verifica il falso, vale a dire trattato come falso in condizioni

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

Non particolarmente utile o intuitivo, ma è intelligente!
thebenedict

2
inutile? È la migliore risposta per test non definiti in IMO stile bdd, tuttavia è necessario installare un altro pacchetto npm (il pacchetto dovrebbe), e non penso che valga la pena installare un altro pacchetto solo per quello, risposta fantastica però
Wagner Leonardi


8

Ho faticato a scrivere l'istruzione should per test non definiti. Quanto segue non funziona.

target.should.be.undefined();

Ho trovato le seguenti soluzioni.

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

if può anche scriverlo come controllo del tipo

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

Non sono sicuro che quanto sopra sia il modo giusto, ma funziona.

Secondo Post di Ghost in GitHub


1
Vale la pena notare che l'utilizzo di questa sintassi può comportare l'interpretazione di JavaScript dell'espressione tra parentesi come un tentativo di invocare la riga precedente come una funzione (se non si terminano le righe con un punto e virgola).
bmacnaughton

5

Prova questo:

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

Grazie, ma è quello che sto facendo nel secondo tentativo sopra. Mi piacerebbe capire come farlo con la sintassi dovrebbe .
thebenedict

1

La risposta di @ david-norman è corretta come da documentazione, ho avuto alcuni problemi con l'installazione e invece ho optato per quanto segue.

(tipo di scope.play (10)). should.be.undefined;


typeofl'operatore restituisce una stringa ; quindi questa affermazione non poteva essere approvata; cuz'undefined' !== undefined
dNitro

1

Non dimenticare una combinazione di havee notparole chiave:

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

0

Puoi racchiudere il risultato della funzione should()e testare un tipo di "undefined":

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.