2013-07-17 34 views
10

, aşağıdaki gibi şeyler yapabilirsiniz:Chai gibi iddia kütüphaneleri bir çağrıya zorlamadan nasıl çalışırlar? <a href="http://chaijs.com/">Chai</a> yılında

expect({}).to.exist; 

exist bir işlev çağrısı değil, ama bu yine de test çerçeveler çalışır. Tersi (expect({}).to.not.exist) testlerin başarısız olmasına neden olur, ancak yine exist bir işlev çağrısı değildir.

Bu iddialar beni bir işlevi çağırmadan nasıl çalışır? Aslında, expect({}).to.exist() söylemeye çalışırsam, exist bir işlev olmadığı için sınama başarısız olur.

cevap

10

Bunu çözdüm (veya en azından yöntemini anladım). JavaScript getters kullanın:

var throws = { 
    get a() { 
    throw new Error('a'); 
    }, 
    get b() { 
    throw new Error('b'); 
    }, 
    get c() { 
    throw new Error('c'); 
    } 
}; 

throws.a, throws.b veya throws.c yapıyor, uygun bir hata atılmış olacaktır. Bu noktadan Chai'nin içerdiği iddiaları oluşturmak oldukça kolaydır.

+0

Bu nasıl açıklıyor? – vsync

+1

Ortada neler olduğunu açıklamaksızın oldukça büyük bir sıçrama. Bağlantılı makale, alıcılara aşina değilseniz, bazı şeyleri açıklamaya gerçekten yardımcı oluyor. Kısa sürüm şu ki, yeni (-ish) tarayıcı geliştirmeleri sayesinde, bir özelliği yalnızca ayarlamanın ötesinde kontrol edebilirsiniz (örn. "A.b = 5"). Şimdi, bir özellik için "getter" yöntemini tanımlayabilirsiniz ve herhangi bir kod bu özelliğin değerini okuyamaya çalıştığında (örn. 'Console.log.a (a.b)'), tarayıcı tanımlanan "getter" yöntemini çalıştırır. Bu yöntem daha sonra mantığı tetikleyebilir (örn. Chai'nin onaylama mantığı). Yani bir 'to.exist 'yaptığınız zaman, sizden sonra' '' '' ('' '' '' '' '' '*' '* * * hala bir yöntem (getter yöntemi) çağırıyor olsa bile. – machineghost