Opierając się na tym samouczku testującym aplikację angularjs z chai, chcę dodać test dla niezdefiniowanej wartości przy użyciu stylu „powinien”. To się nie udaje:
it ('cannot play outside the board', function() {
scope.play(10).should.be.undefined;
});
z błędem „TypeError: Cannot read property„ should ”of undefined”, ale test przechodzi ze stylem „Expect”:
it ('cannot play outside the board', function() {
chai.expect(scope.play(10)).to.be.undefined;
});
Jak sprawić, by działało z „powinien”?
javascript
angularjs
testing
chai
benedykt
źródło
źródło
assert.isUndefined(scope.play(10))
Odpowiedzi:
Jest to jedna z wad składni powinna. 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 mógłby ją przechowywać.
Dokumentacja 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'); });
źródło
should.not.exist
sprawdzi, czy wartość jestnull
taka, ta odpowiedź jest nieprawidłowa. @daniel ma odpowiedź poniżej:should.equal(testedValue, undefined);
. To powinna być akceptowana odpowiedź.should.equal(testedValue, undefined);
jak wspomniano w dokumentacji chai
źródło
.equal()
. Rozumiem, dlaczego @OurManInBananas poprosił o wyjaśnienie. Jest to nieoczekiwane użycie powinno jako funkcji przyjmującej dwa argumenty, zamiast oczekiwanej postaci metody łańcuchowej akceptującej pojedynczy argument dla oczekiwanej wartości. Możesz to osiągnąć tylko poprzez zaimportowanie / wymaganie i przypisanie wywoływanej wersji programu,.should()
jak opisano w zaakceptowanej odpowiedzi @DavidNorman oraz w tej dokumentacji ..equal
składnia generuje znacznie lepsze komunikaty o błędach, ponieważ pozwala wyświetlać komunikaty, które są bardziej opisowe, gdy coś się nie powiedzieTestuj na niezdefiniowane
var should = require('should'); ... should(scope.play(10)).be.undefined;
Sprawdź, czy nie ma wartości null
var should = require('should'); ... should(scope.play(10)).be.null;
Test pod kątem fałszu, tj. Traktowany jako fałszywy w warunkach
var should = require('should'); ... should(scope.play(10)).not.be.ok;
źródło
(typeof scope.play(10)).should.equal('undefined');
źródło
Starałem się napisać instrukcję powinności dla niezdefiniowanych testów. Poniższe nie działa.
Znalazłem następujące rozwiązania.
(target === undefined).should.be.true()
if może również zapisać to jako kontrolę typu
(typeof target).should.be.equal('undefined');
Nie jestem pewien, czy powyższe jest właściwą drogą, ale działa.
Według posta z ghosta na githubie
źródło
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 });
źródło
Nie zapomnij o kombinacji słów kluczowych
have
inot
:const chai = require('chai'); chai.should(); // ... userData.should.not.have.property('passwordHash');
źródło
Odpowiedź @ david-norman jest poprawna zgodnie z dokumentacją, miałem kilka problemów z konfiguracją i zamiast tego zdecydowałem się na następujące.
(typeof scope.play (10)). should.be.undefined;
źródło
typeof
operator zwraca ciąg ; więc tego twierdzenia nie można było przekazać; bo'undefined' !== undefined
Możesz opakować wynik funkcji
should()
i przetestować go pod kątem typu „undefined”:it ('cannot play outside the board', function() { should(scope.play(10)).be.type('undefined'); });
źródło