Chai: cara menguji undefined dengan sintaks 'should'

95

Membangun tutorial ini menguji aplikasi angularjs dengan chai, saya ingin menambahkan tes untuk nilai yang tidak ditentukan menggunakan gaya "harus". Ini gagal:

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

dengan kesalahan "TypeError: Cannot read property 'should' of undefined", tetapi tes lolos dengan gaya "mengharapkan":

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

Bagaimana saya bisa membuatnya bekerja dengan "harus"?

thebenedict
sumber
1
Sangat mudah jika Anda akan menggunakan "assert", Anda dapat melakukannya sebagaiassert.isUndefined(scope.play(10))
lukaserat

Jawaban:

80

Ini adalah salah satu kelemahan dari sintaks should. Ia bekerja dengan menambahkan properti should ke semua objek, tetapi jika nilai kembalian atau nilai variabel tidak ditentukan, tidak ada objek untuk menampung properti.

The dokumentasi memberikan beberapa workarounds, misalnya:

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});
David Norman
sumber
14
should.not.existakan memvalidasi jika nilainya nulljadi jawaban ini salah. @ Daniel memiliki jawaban di bawah ini: should.equal(testedValue, undefined);. Itu harus menjadi jawaban yang diterima.
Sebastian
7
Saya sampai pada jawaban ini (bukan dokumen 🙈) setiap bulan :-)
Ralph Cowling
53
should.equal(testedValue, undefined);

seperti yang disebutkan dalam dokumentasi chai

daniel
sumber
12
omg, apa yang harus dijelaskan? Anda mengharapkan testValue menjadi === undefined sehingga Anda mengujinya. Banyak pengembang yang pertama menempatkan testValue terlebih dahulu dan kemudian menghubungkannya dengan should dan berakhir dengan error ...
daniel
5
Ini tidak berhasil di luar kotak dan tidak ditemukan dalam dokumentasi API untuk.equal() . Saya bisa mengerti kenapa @OurManInBananas meminta penjelasan. Ini adalah penggunaan tidak terduga dari should sebagai fungsi yang menerima dua argumen, alih-alih bentuk metode rantai yang diharapkan menerima satu argumen untuk nilai yang diharapkan. Anda hanya dapat mencapai ini dengan mengimpor / meminta dan menetapkan versi yang dipanggil .should()seperti yang dijelaskan dalam jawaban yang diterima oleh @DavidNorman dan dalam dokumentasi ini .
gfullam
Saya pikir Anda akan menemukan bahwa .equalsintaks itu menghasilkan pesan kesalahan yang jauh lebih baik karena memungkinkan Anda mengeluarkan pesan yang lebih deskriptif ketika ada yang gagal
jcollum
17

Uji untuk tidak terdefinisi

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

Uji null

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

Uji falsy, yaitu diperlakukan sebagai salah dalam kondisi tertentu

var should = require('should');
...
should(scope.play(10)).not.be.ok;
Peter Dotchev
sumber
Tidak terlalu berguna atau intuitif, tapi itu pintar!
thebenedict
2
tidak berguna? Ini adalah jawaban terbaik untuk pengujian tidak terdefinisi dalam IMO gaya bdd, namun perlu menginstal paket npm lain (paket harus), dan saya rasa tidak layak untuk menginstal paket lain hanya untuk itu, jawaban yang mengagumkan
Wagner Leonardi
16
(typeof scope.play(10)).should.equal('undefined');
teddychan
sumber
8

Saya berjuang untuk menulis pernyataan harus untuk tes yang tidak ditentukan. Berikut ini tidak berhasil.

target.should.be.undefined();

Saya menemukan solusi berikut.

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

jika bisa juga menulisnya sebagai cek tipe

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

Tidak yakin apakah cara di atas adalah cara yang benar, tetapi berhasil.

Menurut Posting dari hantu di github

Viraths
sumber
1
Perlu dicatat bahwa menggunakan sintaks ini dapat mengakibatkan JavaScript menafsirkan ekspresi dalam tanda kurung sebagai upaya untuk memanggil baris sebelumnya sebagai fungsi (jika Anda tidak mengakhiri baris dengan titik koma).
bmacnaughton
5

Coba ini:

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
});
EpokK
sumber
Terima kasih, tapi itulah yang saya lakukan pada percobaan kedua di atas. Saya ingin memahami bagaimana melakukannya dengan sintaks should .
thebenediktus
1

Jawaban oleh @ david-norman benar sesuai dokumentasi, saya memiliki beberapa masalah dengan pengaturan dan malah memilih yang berikut ini.

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

Andy Polhill
sumber
typeofoperator mengembalikan sebuah string ; jadi pernyataan ini tidak bisa dilewatkan; cuz'undefined' !== undefined
dNitro
1

Jangan lupa tentang kombinasi dari havedan notkata kunci:

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

Anda dapat menggabungkan hasil fungsi Anda should()dan menguji jenis "tidak ditentukan":

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