Chai'de assert, wait ve must arasındaki fark nedir?


160

Ne arasındaki farktır assert, expectve should, ve ne zaman ne kullanacağız?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');

Yanıtlar:


289

Farklılıklar orada belgelenir .

Üç arayüz, farklı iddialarda bulunma stilleri sunar. Sonuçta, aynı görevi yerine getirirler. Bazı kullanıcılar bir stili diğerine tercih eder. Bununla birlikte, vurgulamaya değer birkaç teknik husus vardır:

  1. Onaylama ve bekletme arayüzleri Object.prototypedeğişmez, oysa değişmelidir. Bu nedenle, değiştiremeyeceğiniz veya değiştirmek istemediğiniz bir ortamda daha iyi bir seçimdir Object.prototype.

  2. Onaylama ve bekletme arayüzleri hemen hemen her yerde özel mesajları destekler. Örneğin:

    assert.isTrue(foo, "foo should be true");
    expect(foo, "foo should be true").to.be.true;

    Onaylama başarısız olursa "foo doğru olmalı" mesajı başarısız onaylama ile birlikte verilir. Must arabirimiyle özel bir ileti ayarlama fırsatı elde edemezsiniz.

(Tarihsel not: Bu cevap uzun zamandır özel bir mesaj almak expectiçin bir geçici çözüm kullanmanız gerektiğini belirtti. Aurélien Ribon bana expectikinci bir parametre olarak bir mesaj iletmenin işe yaradığını söyledi. Bu mesaj için hangi Mocha sürümünün destek sağlamaya başladığını bulamadım veya belgelerin hangi sürümünün ilk kez belgelendiğini bulamadım.)

Not assert.isTrue(foo), expect(foo).to.be.trueve foo.should.be.trueözel bir mesaj kullanmak istemiyorsanız tüm çıkış takip ve foo === 1:

    AssertionError: expected 1 to be true

Bu nedenle, bekle ve ara arabirimi okumak daha güzel olsa da, bir iddia başarısız olduğunda bir arabirimin diğerinden daha doğal olarak bilgilendirici olması gibi değildir. Her üç arayüz için de aynı olan bu mesaj size tam olarak neyi test ettiğinizi söylemez , sadece elde ettiğiniz değerin ne olduğunu 1istersiniz true. Neyi test ettiğinizi bilmek istiyorsanız, bir mesaj eklemeniz gerekir.


8
Ayrıca şunları da yapabilirsinizexpect(foo).to.equal(true, "foo should be true");
user5325596

expect
Mirko

@Mirko Mocha versiyonu burada kritik olan şey değil. En son Chai'yi mi kullanıyorsunuz?
Louis

Benim için de bir vanilya ekspresinde (4.16.3), mocha (5.1.1), chai (4.1.2), chai-http (4.0.0) projesinde. Özel mesaj, komutla çalıştırıldığında mochave bir test hatası aldığında hiçbir yerde görünmez .
Juha Untinen

15

Umarım bu basit örnekler farklılıklarını netleştirir

belirt

var assert = require('chai').assert
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

assert.typeOf(foo, 'string'); // without optional message
assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
assert.equal(foo, 'bar', 'foo equal `bar`');
assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');

Her durumda, assert stili, assert deyimindeki son parametre olarak isteğe bağlı bir mesaj eklemenizi sağlar. İddianız geçmediği takdirde bunlar hata mesajlarına dahil edilecektir.

Not bekliyoruz ve yapı iddialarının gerektiği kullanımlar chainable dil, ancak bir iddia başlangıçta inşa edilmiş şekilde farklıdır. Gerekirse, uyarıların üstesinden gelmek için bazı uyarılar ve ek araçlar da vardır.

beklemek

var expect = require('chai').expect
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(beverages).to.have.property('tea').with.lengthOf(3);

Expect, oluşabilecek başarısız iddiaların önüne geçmek için rastgele mesajlar eklemenizi sağlar.

var answer = 43;

// AssertionError: expected 43 to equal 42.
expect(answer).to.equal(42);

// AssertionError: topic [answer]: expected 43 to equal 42.
expect(answer, 'topic [answer]').to.equal(42);

Bu, booleans veya sayılar gibi açıklayıcı olmayan konularla kullanıldığında kullanışlıdır.

Meli

Must stili, bekleme arabirimi ile aynı zincirlenebilir iddialara izin verir, ancak her nesneyi zincirinizi başlatmak için bir should özelliğiyle genişletir. Bu stilin Internet Explorer ile kullanıldığında bazı sorunları vardır, bu nedenle tarayıcı uyumluluğuna dikkat edin.

var should = require('chai').should() //actually call the function
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
beverages.should.have.property('tea').with.lengthOf(3);

Beklenti ve zorunluluk arasındaki farklar

Her şeyden önce, bekletme gereksiniminin bekletme işlevine bir başvuru olduğuna dikkat edin, oysa gereksinim duyulduğunda işlev yürütülüyor.

var chai = require('chai')
, expect = chai.expect
, should = chai.should();

Bekliyoruz arayüz dil iddialarını zincirleme için bir başlangıç noktası olarak bir işlev sağlar. Node.js ve tüm tarayıcılarda çalışır.

Gerektiğini arabirimi Dil iddialar için başlangıç noktası olarak tek getter sağlamak için Object.prototype uzanır. Node.js üzerinde ve Internet Explorer dışındaki tüm modern tarayıcılarda çalışır.

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.