Chai: 'should' sözdizimi ile tanımsız için nasıl test edilir


96

Bina bu chai ile angularjs uygulamayı test öğretici, ben "gereken" stilini kullanarak tanımlanmamış bir değer için bir test eklemek istiyorum. Bu başarısız:

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

"TypeError: Tanımsız 'olması gereken' özelliği okunamıyor, ancak test" beklenen "stiliyle başarılı oluyor:

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

Bunu "should" ile nasıl çalıştırabilirim?


1
Eğer "assert" kullanacağız eğer siz bunu yapabilirsiniz, kolayassert.isUndefined(scope.play(10))
lukaserat

Yanıtlar:


80

Bu, gerekir sözdiziminin dezavantajlarından biridir. Should özelliğini tüm nesnelere ekleyerek çalışır, ancak bir dönüş değeri veya değişken değeri tanımlanmamışsa, özelliği tutacak bir nesne yoktur.

Dokümantasyon örneğin bazı geçici çözümler verir:

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.existdeğerin böyle olup olmadığını doğrulayacaktır, nullbu yüzden bu cevap doğru değildir. @daniel aşağıda cevabı vardır: should.equal(testedValue, undefined);. Kabul edilen cevap bu olmalıdır.
Sebastian

7
Bu yanıta aylık olarak geliyorum (docs 🙈 değil) :-)
Ralph Cowling

54
should.equal(testedValue, undefined);

chai belgelerinde belirtildiği gibi


12
Aman tanrım, açıklayacak ne var? TestValue'nun === tanımsız olmasını beklersiniz, böylece onu test edersiniz. Pek çok geliştirici önce testValue koydu ve sonra should ile zincirledi ve bu hata ile sonuçlandı ...
daniel

5
Bu, kutudan çıktığı gibi çalışmaz ve için API belgelerinde.equal() bulunmaz . @OurManInBananas'ın neden bir açıklama istediğini anlayabiliyorum. Beklenen değer için tek bir bağımsız değişken kabul eden beklenen zincirleme yöntem biçimi yerine, iki bağımsız değişken kabul eden bir işlev olarak should'ın beklenmedik bir kullanımıdır. Bunu yalnızca .should()@DavidNorman tarafından kabul edilen yanıtta ve bu belgede açıklandığı gibi çağrılmış bir sürümünü içe aktararak / zorunlu kılarak ve atayarak başarabilirsiniz .
gfullam

Sanırım bu .equalsözdiziminin çok daha iyi hata mesajları ürettiğini göreceksiniz çünkü işler başarısız olduğunda daha açıklayıcı mesajlar vermenize izin veriyor
jcollum

17

Tanımsız için test et

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

Boşluk testi

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

Yanlışlık testi yapın, yani koşullarda yanlış olarak değerlendirilir

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

Özellikle kullanışlı veya sezgisel değil, ama bu akıllıca!
thebenedict

2
yararlı değil? Bu, bdd tarzı IMO'da tanımsız testler için en iyi cevaptır, ancak başka npm paketini (gerekir paketi) kurması gerekir ve bunun için başka bir paket kurmaya değeceğini düşünmüyorum, yine de harika bir cevap
Wagner Leonardi


8

Tanımsız testler için gereken ifadesini yazmakta zorlandım. Aşağıdakiler çalışmıyor.

target.should.be.undefined();

Aşağıdaki çözümleri buldum.

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

bunu bir tür kontrolü olarak da yazabilirseniz

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

Yukarıdakilerin doğru yol olup olmadığından emin değilim, ama işe yarıyor.

Github'daki hayaletten gönderiye göre


1
Bu sözdiziminin kullanılması, JavaScript'in parantezli ifadeyi önceki satırı bir işlev olarak çağırma girişimi olarak yorumlamasına neden olabilir (satırları noktalı virgülle bitirmiyorsanız).
bmacnaughton

5

Bunu dene:

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

Teşekkürler, ama yukarıdaki ikinci denemede yaptığım şey bu. Bunun gerekir sözdizimi ile nasıl yapılacağını anlamak istiyorum .
thebenedict

2

haveVe notanahtar kelimelerin bir kombinasyonunu unutmayın :

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

1

@ David-norman'ın cevabı belgelere göre doğrudur, kurulumla ilgili birkaç sorun yaşadım ve bunun yerine aşağıdakileri seçtim.

(typeof kapsam.play (10)). should.be.undefined;


typeofoperatör bir dize döndürür ; bu nedenle bu iddia geçilemedi; cuz'undefined' !== undefined
dNitro

0

İşlev sonucunuzu içine alabilir should()ve bir "tanımsız" türünü test edebilirsiniz:

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.