2013-10-06 13 views
75

Budując na this tutorialu testując aplikację angularjs z chai, chcę dodać test dla niezdefiniowanej wartości, używając stylu "powinien". To się nie powiedzie:Chai: jak przetestować niezdefiniowane za pomocą składni "powinien"

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

o błędzie „Błąd typu: nie można odczytać właściwość«powinny»undefined”, ale test przechodzi z „oczekiwać” styl:

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

Jak mogę dostać pracy z "powinien"?

+1

To proste, jeśli będziesz używać „dochodzić”, można zrobić to jako 'assert.isUndefined (zakres .play (10)) ' – lukaserat

Odpowiedz

65

Jest to jedna z wad należy składni. Działa poprzez dodanie właściwości should do wszystkich obiektów, ale jeśli wartość zwracana lub wartość zmiennej jest niezdefiniowana, nie ma obiektu, który będzie utrzymywał właściwość.

documentation daje pewne obejścia, na przykład:

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

'should.not.exist' sprawdzi, czy wartość wynosi' null', więc ta odpowiedź nie jest poprawna. @daniel ma odpowiedź poniżej: 'should.equal (testedValue, undefined);'. To powinna być zaakceptowana odpowiedź. – Sebastian

+5

Przychodzę do tej odpowiedzi (nie do dokumentów) co miesiąc :-) –

4

Spróbuj tego:

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

Dzięki, ale to właśnie robię w drugiej próbie powyżej. Chciałbym zrozumieć, jak to zrobić za pomocą składni [should] (http://chaijs.com/guide/styles/#should). – thebenedict

0

Można owinąć wynik funkcji w should() i test dla typu "nieokreślone":

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

jak wspomniano w dokumentacji chai

+12

omg, co tam wyjaśnić? Oczekujesz parametru testedValue na === undefined, aby go przetestować. Wielu deweloperów najpierw umieszcza najpierw testValue, a potem łączy go z poleceniem i kończy na błędzie ... – daniel

+5

To nie działa po wyjęciu z pudełka i nie można go znaleźć w [dokumentacji API dla '.equal() '] (http://chaijs.com/api/bdd/#method_equal). Rozumiem, dlaczego @OurManInBananas poprosił o wyjaśnienie. Jest to nieoczekiwane użycie funkcji powinien przyjmować dwa argumenty, zamiast oczekiwanej, zakodowanej formy akceptującej pojedynczy argument dla oczekiwanej wartości. Możesz to osiągnąć jedynie poprzez import/wymaganie i przypisanie wywoływanej wersji '.should()' jak opisano w zaakceptowanej odpowiedzi przez @DavidNorman iw tej [dokumentacji] (http://chaijs.com/guide/styles/# should-extras). – gfullam

+0

Myślę, że przekonasz się, że ta składnia '.equal' generuje znacznie lepsze komunikaty o błędach, ponieważ pozwala ci na wysyłanie komunikatów, które są bardziej opisowe, gdy rzeczy się nie powiedzie – jcollum

15
(typeof scope.play(10)).should.equal('undefined'); 
1

Odpowiedź @ david-norman jest poprawna zgodnie z dokumentacją, miałem kilka problemów z instalacją i wybrałem następujące.

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

+0

' operator 'typof' zwraca ** ciąg **; więc to stwierdzenie nie mogło zostać przekazane; bo ''undefined'! == undefined' – dNitro

15

Test nieokreślonej

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

test dla wartości null

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

testowym dla falsy, czyli traktować jako fałszywe w warunkach

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

Niezbyt użyteczne lub intuicyjne, ale to sprytne! – thebenedict

+2

nie przydatne? To najlepsza odpowiedź na niezdefiniowane testy w IMO w stylu bdd, jednak musi zainstalować inny pakiet npm (pakiet powinien) i nie sądzę, że warto zainstalować inny pakiet tylko na to, wspaniała odpowiedź chociaż –

6

Walczyłem napisać powinny oświadczenie dla niezdefiniowany testy. Poniższe nie działa.

target.should.be.undefined(); 

Znalazłem następujące rozwiązania.

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

jeśli można również zapisać go jako test typu

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

Nie wiem, czy powyższe jest właściwa droga, ale to nie działa.

According to Post from ghost in github

+0

Warto zauważyć, że za pomocą ta składnia może spowodować interpretację JavaScript wyrażenia parentetyzowanego jako próby wywołania poprzedniej linii jako funkcji (jeśli nie kończymy linii średnikiem). – bmacnaughton

0

Nie zapomnij o połączeniu have i not słów kluczowych:

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