2013-07-03 45 views
29

Tôi cần kiểm tra mã JavaScript dựa trên setTimeout để thực hiện các tác vụ định kỳ. Làm thế nào tôi có thể từ các thử nghiệm Mocha của tôi mô phỏng thời gian trôi qua để gọi lại setTimeout được gọi?Làm thế nào tôi có thể mô phỏng thời gian trôi qua trong các thử nghiệm Mocha sao cho các callbacks setTimeout được gọi?

Tôi về cơ bản yêu cầu chức năng tương tự như Jasmine's Mock Clock, cho phép bạn nâng cao thời gian JavaScript bằng một số bọ ve.

Trả lời

49

Tôi phát hiện ra rằng Sinon.JS có hỗ trợ thao tác đồng hồ JavaScript, thông qua sinon.useFakeTimers, như được mô tả trong tài liệu Fake Timers của nó. Điều này là hoàn hảo kể từ khi tôi đã sử dụng Sinon cho mục đích chế nhạo, và tôi đoán nó có ý nghĩa rằng bản thân Mocha không hỗ trợ điều này vì nó là nhiều hơn trong miền của một thư viện mocking.

Dưới đây là một ví dụ sử dụng Mocha/Chai/Sinon:

var clock; 
beforeEach(function() { 
    clock = sinon.useFakeTimers(); 
}); 

afterEach(function() { 
    clock.restore(); 
}); 

it("should time out after 500 ms", function() { 
    var timedOut = false; 
    setTimeout(function() { 
     timedOut = true; 
    }, 500); 

    timedOut.should.be.false; 
    clock.tick(510); 
    timedOut.should.be.true; 
}); 
+0

tại sao beforeEach và afterEach? – R01010010

+1

@Rimbuaj Để cài đặt đồng hồ mô phỏng trước mỗi lần kiểm tra và gỡ bỏ nó sau đó? – aknuds1

+0

nhưng chỉ có một thử nghiệm ... đó là lý do tại sao tôi yêu cầu – R01010010