2017-06-26 30 views
18
expect(true).to.be.true; 

Bu kodda, 'to', 'be', 'true' ifadelerinin tümü, 'expect (true)' öğesinden gelen nesne yanıtının bir özniteliği gibi görünüyor.Chai'de() .be.be.true nasıl çalışır?

Bu özellikler nasıl bir istisna oluşturabilecek şekilde çalışır?

+0

Ben javascript en [ '__defineGetter__'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__) arayüzü üzerinden çalışır düşünebiliriz . –

+5

Bu özellik, hiçbir şey yapmayan ve yalnızca gürültü ekleyen bir grup kukla özellik ekledikleri için işe yarıyor. Ben iddia ediyorum assert.isTrue() 'daha okunabilir ve kesinlikle böyle bir soruyu sormaz. –

+1

@MattiVirkkunen Evet, insanlar kod isterlerse * İngilizce * ve değil * İngilizce-gibi * Kitap yazmaları gerektiğini düşünürüm – cat

cevap

16

aşağıda kod parçacığının true as defined bakacağız geçerli:

[ 'to', 'be', 'been' 
    , 'is', 'and', 'has', 'have' 
    , 'with', 'that', 'which', 'at' 
    , 'of', 'same', 'but', 'does' ].forEach(function (chain) { 
    Assertion.addProperty(chain); 
}); 

ve addPropertyutils içinde vardır:
https://github.com/chaijs/chai/blob/master/lib/chai/utils/addProperty.js

Bu özellik sayesinde istediğiniz gibi zincirleme yapabilirsiniz: .to.be.to.to.to.be.equal()

en basit gösteri yaratalım: .true() yöntemle

const assert = { 
    'true': function (v) { 
    return !!v 
    } 
} 

ile

bir assert nesne olduğunu varsayalım ve sonsuz zincirin .to edebilmek istiyorum. Bunun için gaz giderici tanımlamak için defineProperty kullanın: yani şimdi

Object.defineProperty(assert, 'to', { 
    get() { 
    return assert 
    } 
}) 

yapabilirsiniz

assert.to.to.to.to.true(false) 

çalışma kodu: Burada başka daha karmaşık bir örnek ekledik https://codepen.io/CodinCat/pen/LLzBEX?editors=0012


: https://codepen.io/CodinCat/pen/dRVjXL?editors=0012

Gördüğünüz Bu örnekte

tha .true özelliğinde bazı davranışlar var.

Biz iç __expectObj yılında expect() değeri ve __value özelliği depolamak ve sonra .true ait getter bunu doğrulamak. Yani

expect(false).to.to.to.to.true 
+1

'true' işlevinin olduğu kod gereksizdir, eminim ki OP bir işlevi nasıl yazacağını bilir. Sorunun asıl cevabı bir bağlantının arkasında gizlidir; lütfen cevabınıza taşıyın. –

+0

Evet, '.true' nin bir özellik (bir yöntem değil) olduğu da benim en çok merak ettiğim durum. Kısacası, '' true'' için 'gett (false) .true' gibi bir aramada tetiklenen bir getter fonksiyonu vardır ve getter fonksiyonu testi çalıştırır ... Vay, ilginç! –

7

chai Assertion kaynağına bir göz atın, ancak tl; dr, Chai kendi zincirlenebilir yöntemlerini kendi iddi kitaplığında uyguladığıdır. Bununla birlikte, özel anahtar kelimeler, aşağıdaki koddaki gibi sadece sözdizimsel şekerlerdir. Orada aslında arar kadarıyla

/** 
    * ### Language Chains 
    * 
    * The following are provided as chainable getters to improve the readability 
    * of your assertions. 
    * 
    * **Chains** 
    * 
    * - to 
    * - be 
    * - been 
    * - is 
    * - that 
    * - which 
    * - and 
    * - has 
    * - have 
    * - with 
    * - at 
    * - of 
    * - same 
    * - but 
    * - does 
    * 
    * @name language chains 
    * @namespace BDD 
    * @api public 
    */ 

    [ 'to', 'be', 'been' 
    , 'is', 'and', 'has', 'have' 
    , 'with', 'that', 'which', 'at' 
    , 'of', 'same', 'but', 'does' ].forEach(function (chain) { 
    Assertion.addProperty(chain); 
    }); 

o özellikle tanımlar anahtar gibidir: Tam anlamıyla onlar eklenir ve zincirleme edilebilir ama hiçbir şey gerçekten tanımlanır sadece özellikleridir. Yani bir örnek anahtar kelime .to.be.true Bunu kaynak kodunu kontrol edebilirsiniz

/** 
    * ### .true 
    * 
    * Asserts that the target is strictly (`===`) equal to `true`. 
    * 
    *  expect(true).to.be.true; 
    * 
    * Add `.not` earlier in the chain to negate `.true`. However, it's often best 
    * to assert that the target is equal to its expected value, rather than not 
    * equal to `true`. 
    * 
    *  expect(false).to.be.false; // Recommended 
    *  expect(false).to.not.be.true; // Not recommended 
    * 
    *  expect(1).to.equal(1); // Recommended 
    *  expect(1).to.not.be.true; // Not recommended 
    * 
    * A custom error message can be given as the second argument to `expect`. 
    * 
    *  expect(false, 'nooo why fail??').to.be.true; 
    * 
    * @name true 
    * @namespace BDD 
    * @api public 
    */ 

    Assertion.addProperty('true', function() { 
    this.assert(
     true === flag(this, 'object') 
     , 'expected #{this} to be true' 
     , 'expected #{this} to be false' 
     , flag(this, 'negate') ? false : true 
    ); 
    });