2013-07-17 45 views
10

Trong Chai, bạn có thể làm những thứ như sau:Các thư viện xác nhận như Chai hoạt động như thế nào mà không phải thực hiện cuộc gọi đến một hàm?

expect({}).to.exist; 

exist không phải là một cuộc gọi chức năng, nhưng điều này vẫn hoạt động trong khuôn khổ kiểm tra. Ngược lại (expect({}).to.not.exist) khiến các kiểm tra thất bại, nhưng một lần nữa, exist không phải là một cuộc gọi hàm.

Các xác nhận này hoạt động như thế nào mà không khiến tôi gọi hàm? Trong thực tế, nếu tôi cố gắng nói expect({}).to.exist() kiểm tra không thành công vì exist không phải là một hàm.

Trả lời

10

Tôi đã tìm ra (hoặc ít nhất, tôi đã tìm ra phương thức). Sử dụng JavaScript getters:

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

Khi làm throws.a, throws.b, hoặc throws.c, lỗi thích hợp sẽ được ném.

Từ thời điểm đó, việc tạo các xác nhận được chứa trong Chai là khá dễ dàng.

+0

Điều đó giải thích điều đó như thế nào? Đó là một bước nhảy khá lớn mà không giải thích những gì xảy ra ở giữa – vsync

+1

Bài viết được liên kết thực sự giúp giải thích mọi thứ nếu bạn không quen với getters. Phiên bản ngắn gọn là nhờ có các cải tiến mới cho trình duyệt (-ish), bây giờ bạn có thể kiểm soát một thuộc tính ngoài việc thiết lập nó (ví dụ: 'a.b = 5'). Bây giờ, bạn có thể định nghĩa một phương thức "getter" cho một thuộc tính, và khi bất kỳ mã nào cố đọc giá trị của thuộc tính đó (ví dụ 'console.log (a.b)') trình duyệt sẽ chạy phương thức "getter" đã định nghĩa. Phương pháp đó sau đó có thể kích hoạt logic (ví dụ như logic khẳng định của Chai). Vì vậy, khi bạn làm một 'to.exist', mặc dù không có'() 'sau khi bạn * đang * vẫn gọi một phương thức (phương thức getter). – machineghost