Bạn có thể kiểm tra mã nguồn:
[ 'to', 'be', 'been'
, 'is', 'and', 'has', 'have'
, 'with', 'that', 'which', 'at'
, 'of', 'same', 'but', 'does' ].forEach(function (chain) {
Assertion.addProperty(chain);
});
và có một addProperty
trong utils
:
https://github.com/chaijs/chai/blob/master/lib/chai/utils/addProperty.js
Với điều này, bạn có thể chuỗi các thuộc tính vô hạn như: .to.be.to.to.to.be.equal()
Hãy tạo một cuộc biểu tình đơn giản:
Giả sử rằng bạn có một đối tượng assert
, với .true()
phương pháp
const assert = {
'true': function (v) {
return !!v
}
}
và bạn muốn để có thể chuỗi .to
vô hạn. Đơn giản chỉ cần sử dụng các defineProperty
để xác định getter của chúng tôi:
Object.defineProperty(assert, 'to', {
get() {
return assert
}
})
vì vậy bây giờ bạn có thể
assert.to.to.to.to.true(false)
đang làm việc: https://codepen.io/CodinCat/pen/LLzBEX?editors=0012
Tôi đã thêm một ví dụ khác phức tạp hơn ở đây: https://codepen.io/CodinCat/pen/dRVjXL?editors=0012
Trong ví dụ này, bạn có thể thấy tha t có một số hành vi trong thuộc tính .true
.
Chúng tôi lưu trữ giá trị từ expect()
trong nội bộ __expectObj
và thuộc tính __value
và sau đó xác minh nó trong bộ thu của .true
. Vì vậy, bạn có thể
expect(false).to.to.to.to.true
Tôi nghĩ rằng nó hoạt động thông qua (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__) giao diện javascript của [__defineGetter__' '] . –
Nó hoạt động bởi vì họ đã thêm một loạt các thuộc tính giả mà không làm gì và chỉ thêm tiếng ồn. Tôi sẽ tranh luận 'assert.isTrue()' là dễ đọc hơn và chắc chắn sẽ không nhắc một câu hỏi như thế này. –
@MattiVirkkunen Vâng, nếu mọi người muốn mã là * Tiếng Anh * và không * Tiếng Anh giống * Tôi nghĩ họ nên viết sách thay vì – cat