2015-09-01 18 views
16

Điều này về cơ bản là theo dõi Remove timeout for single jasmine spec vấn đề github.Thời gian chờ hoa nhài vô hạn

Câu hỏi đặt ra:

Có thể để thực hiện một thử nghiệm duy nhất không bao giờ thời gian chờ?

Vấn đề:

Có thể đặt một giá trị thời gian chờ trên toàn cầu thông qua DEFAULT_TIMEOUT_INTERVAL hoặc cho mỗi mô tả với beforeEach/afterEach hoặc trên một đơn it() khối:

it('Has a custom timeout', function() { 
    expect(true).toBeTruthy(); 
}, value in msec) 

Tôi quan tâm trong việc có một thông số duy nhất không bao giờ hết thời gian chờ. Tôi đã cố gắng để làm theo những lời khuyên được đề xuất trong vấn đề github đề cập và sử dụng Infinity:

it('Has a custom timeout', function() { 
    expect(true).toBeTruthy(); 
}, Infinity) 

nhưng, tôi đã có những lỗi sau ngay sau khi kiểm tra đã vào it() khối:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

Tôi đoán tôi không thể sử dụng Infinity làm giá trị hết giờ hoặc tôi đang làm điều gì đó sai.


Giải pháp thay thế, tôi có thể sử dụng số lớn được mã hoá cứng thay thế, nhưng tôi muốn tránh điều đó.

+0

Ra khỏi tò mò, trường hợp sử dụng để có một spec mà không bao giờ lần ra là gì? – finspin

+0

@finspin đó là một câu hỏi hay. Tôi có một thử nghiệm chạy dài có thể mất một khoảng thời gian đáng kể để hoàn thành. Nói đúng ra nó không thể là vô hạn và có giới hạn lành mạnh cho thời gian thực hiện của nó. Nhưng, tôi thực sự tò mò nếu nó có thể có một thời gian chờ vô hạn. Cảm ơn. Và, có 'Infinity' như một giá trị thời gian chờ như trái ngược với' 1000000' tôi nghĩ sẽ làm cho tôi cảm thấy tốt hơn về mã. – alecxe

Trả lời

11

Jasmine sử dụng nội bộ setTimeout để đợi thông số kỹ thuật kết thúc trong một khoảng thời gian xác định.

Theo Q này/A - Why does setTimeout() "break" for large millisecond delay values?:

setTimeout using a 32 bit int to store the delay

...

Timeout values too big to fit into a signed 32-bit integer may cause overflow in FF, Safari, and Chrome, resulting in the timeout being scheduled immediately. It makes more sense simply not to schedule these timeouts, since 24.8 days is beyond a reasonable expectation for the browser to stay open.

Ngay sau khi Infinity lớn hơn bất kỳ số khác tràn xảy ra.

Số nguyên an toàn tối đa trong trường hợp này là 2 -1 = 2147483647. Giá trị này là hữu hạn, vì vậy thử nghiệm sẽ không thực sự chạy vô hạn, nhưng như đã nói, tôi cho rằng 24,8 ngày là đủ dài.

Bạn có thể định nghĩa một hằng số để lưu trữ giá trị này:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 2000; 

var MAX_SAFE_TIMEOUT = Math.pow(2, 31) - 1; 

describe('suite', function() { 

    it('should work infinitely long', function (done) { 

    setTimeout(function() { 
     expect(true).toBe(true); 
     done(); 
    }, 3000) 

    }, MAX_SAFE_TIMEOUT); 

}); 

See working sample here

+0

Cảm ơn bạn đã giải thích chi tiết một lần nữa! – alecxe

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