2015-07-24 38 views
11

Từ api chai của bạn đã có mã như thế này:Chức năng chai mong đợi hoạt động như thế nào?

.exist 

Asserts that the target is neither null nor undefined. 

var foo = 'hi' 
    , bar = null 
    , baz; 

expect(foo).to.exist; 
expect(bar).to.not.exist; 
expect(baz).to.not.exist; 

Làm thế nào để tồn tại việc bán? Hàm mong đợi trả về một đối tượng, sau đó chỉ đơn giản là tra cứu thuộc tính trên đối tượng "to". Đó chỉ đơn giản là một đánh giá tài sản mặc dù phải không? Điều duy nhất có ý nghĩa với tôi là nếu tài sản tồn tại là một phương thức getter.

Di chuyển là gì?

+0

Đó là thuộc tính * getter *. – Bergi

+0

Vâng, không được sử dụng để sử dụng chúng rất nhiều. –

+0

Vâng, 'chai' bao trùm chúng. Và bạn đã không có một cái nhìn tại 'nên' ... – Bergi

Trả lời

2

chai hiển thị phương thức use để truy cập xuất khẩu chai và đó là utils.

Phương thức này có thể được bên thứ ba sử dụng khi creating plugins, nhưng cũng được sử dụng nội bộ để tải giao diện của nó.

Việc thực hiện phương pháp này rất đơn giản:

exports.use = function (fn) { 
    if (!~used.indexOf(fn)) { 
    fn(this, util); 
    used.push(fn); 
    } 

    return this; 
}; 

Bên trong nó sử dụng này để nạp (trong số khác) chính Assertion prototype và các chức năng cốt lõi khẳng định:

var assertion = require('./chai/assertion'); // primary Assertion prototype 
exports.use(assertion); // load it 

var core = require('./chai/core/assertions'); // core assertion functionality 
exports.use(core); // load it 

Một trong những phương pháp mà được hiển thị bởi Assertion prototype là phương pháp addProperty cho phép bạn thêm thuộc tính vào prototype.

Nội bộ chai sử dụng phương pháp này để thêm chức năng xác nhận chính vào Assertion prototype. Ví dụ: tất cả các chuỗi ngôn ngữ và người trợ giúp khẳng định (exist, empty, v.v.) được thêm theo cách này.

chuỗi Ngôn Ngữ:

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

Tất cả các chức năng này có sẵn khi một giao diện cụ thể được nạp nội bộ, ví dụ expect. Khi giao diện này được nạp, một mới Assertion prototype sẽ được khởi tạo bất cứ khi nào expect được thực hiện, trong đó sẽ chứa tất cả các chức năng:

// load expect interface 
var expect = require('./chai/interface/expect'); // expect interface 
exports.use(expect); // load it 

// expect interface 
module.exports = function (chai, util) { 
    chai.expect = function (val, message) { 
    return new chai.Assertion(val, message); // return new Assertion Object with all functionality 
    }; 
}; 

Như bạn có thể thấy phương pháp expect chấp nhận một đối số val (và một tùy chọn message lập luận). Khi phương thức này được gọi (ví dụ expect(foo)) một Assertion prototype mới sẽ được khởi tạo và trả về, hiển thị tất cả chức năng cốt lõi (cho phép bạn thực hiện expect(foo).to.exist).

Assertion Constructor sử dụng flagutil để đặt giá trị cờ trên đối tượng ánh xạ đến đối số được chuyển trong đối số val.

function Assertion (obj, msg, stack) { 
    flag(this, 'ssfi', stack || arguments.callee); 
    flag(this, 'object', obj); // the 'object' flag maps to the passed in val 
    flag(this, 'message', msg); 
    } 

Tất cả exist sau đó không, là có được giá trị này thông qua các flagutil và đánh giá nếu nó không tương đương với null, bằng cách sử dụng phương pháp assert xác định trên Assertion prototype.

Assertion.addProperty('exist', function() { 
    this.assert(
     null != flag(this, 'object') 
     , 'expected #{this} to exist' 
     , 'expected #{this} to not exist' 
    ); 
    }); 
+0

Nhưng làm thế nào nó dừng mã còn lại sau khi cuộc gọi mong đợi từ thực hiện nếu thử nghiệm thất bại? Ví dụ, nếu có một 'done()' gọi lại sau đó trong 'nó', nó không được thực hiện ... –

0

Khi bạn gọi expect(foo), một đối tượng xác nhận mới được khởi tạo.

đến, có, cùng và các thuộc tính tương tự không làm gì khác ngoài việc trả về cá thể Xác nhận đó. Chúng chỉ dành cho khả năng đọc.

Tuy nhiên, trong ví dụ của bạn, tồn tại, thực sự là một cái gì đó chạy một xác nhận.

Thuộc tính của nó. Họ cách tính được thêm vào Assertion là họ được định nghĩa là chức năng getter như bạn có thể see here.

expect(foo).to.exist có thể được chia nhỏ như thế này:

const assertion = new Assertion; 
assertion.exists; 

assertion.exists được bổ sung vào đối tượng khẳng định với một getter. Điều đó có nghĩa là khi bạn thực hiện assertion.exists, để đánh giá giá trị của assertion.exists, một hàm đã được cung cấp trước đó cho addProperty được thực hiện.

Bạn có thể đọc thêm về getter functions.

Các vấn đề liên quan