2013-02-25 39 views
12

Tôi đang sử dụng Mocha để kiểm tra hàm không đồng bộ trả về lời hứa.Cách kiểm tra lời hứa với Mocha

Cách tốt nhất để kiểm tra xem lời hứa có giải quyết đúng giá trị không?

+0

thực hiện một chức năng nhận 'it' và trả về một hàm mà bạn gọi thay vì nó thực hiện tất cả điều này một cách tự động. Hàm test của bạn sẽ cần bắt đầu bằng 'return getSomePromise()' –

+0

"Khi xác nhận này không thành công, nó sẽ bị nuốt". Để làm rõ, ngoại lệ rằng 'value.should.equal' ném bị bắt bởi hàm gọi lại" thành công ". Đây là một tính năng của Promises/A + để đảm bảo rằng bạn luôn có thể xử lý bất kỳ lỗi nào (ngoại lệ hoặc cách khác) trong cuộc gọi lại "thất bại" ở cuối chuỗi lời hứa. –

Trả lời

7

Mocha đã cài sẵn Hỗ trợ lời hứa như phiên bản 1.18.0 (tháng 3 năm 2014). Bạn có thể trả lại lời hứa từ một trường hợp kiểm tra và Mocha sẽ đợi lời hứa:

it('does something asynchronous', function() { // note: no `done` argument 
    return getSomePromise().then(function(value) { 
    expect(value).to.equal('foo'); 
    }); 
}); 

Đừng quên từ khóa return trên dòng thứ hai. Nếu bạn vô tình bỏ qua nó, Mocha sẽ giả định thử nghiệm của bạn là đồng bộ, và nó sẽ không chờ đợi cho các chức năng .then, vì vậy kiểm tra của bạn sẽ luôn luôn vượt qua ngay cả khi khẳng định không thành công.


Nếu đây trở nên quá lặp đi lặp lại, bạn có thể muốn sử dụng thư viện chai-as-promised, mang đến cho bạn một tài sản để kiểm tra những lời hứa dễ dàng hơn eventually:

it('does something asynchronous', function() { 
    return expect(getSomePromise()).to.eventually.equal('foo'); 
}); 

it('fails asynchronously', function() { 
    return expect(getAnotherPromise()).to.be.rejectedWith(Error, /some message/); 
}); 

Một lần nữa, đừng quên các từ khóa return !

+0

Xin lỗi tôi không hiểu, tôi có một thử nghiệm đơn giản 'browser.url (..); title = browser.getTitle(); mong đợi (title) .to.equal ('foo'); 'Làm thế nào tôi có thể sử dụng' getPromise() 'trong trường hợp của tôi? – Gobliins

4

Sau đó, 'trả về' một lời hứa có thể được sử dụng để xử lý lỗi. Hầu hết các thư viện đều hỗ trợ một phương thức có tên là done, điều này sẽ đảm bảo rằng mọi lỗi chưa xử lý được đưa ra.

it('does something asynchronous', function (done) { 
    getSomePromise() 
    .then(function (value) { 
     value.should.equal('foo') 
    }) 
    .done(() => done(), done); 
}); 

Bạn cũng có thể sử dụng một cái gì đó như mocha-as-promised (có thư viện tương tự cho các khung kiểm tra khác). Nếu bạn đang chạy phía máy chủ:

npm install mocha-as-promised 

Sau đó, vào lúc bắt đầu của kịch bản của bạn:

require("mocha-as-promised")(); 

Nếu bạn đang chạy phía khách hàng:

<script src="mocha-as-promised.js"></script> 

Sau đó bên trong các bài kiểm tra của bạn, bạn chỉ có thể trả lại lời hứa:

it('does something asynchronous', function() { 
    return getSomePromise() 
    .then(function (value) { 
     value.should.equal('foo') 
    }); 
}); 

Hoặc trong tập lệnh cà phê (theo ví dụ ban đầu của bạn)

it 'does something asynchronous',() -> 
    getSomePromise().then (value) => 
    value.should.equal 'foo' 
Các vấn đề liên quan