2017-03-11 24 views
7

Ví dụ, tôi có một chức năng như thế này:Làm cách nào để thử nghiệm một hàm trả về một khoảng thời gian có thể quan sát được bằng các khoảng thời gian được định thời trong rxjs 5?

export function timeRange(start: number, end: number): Rx.Observable<number> { 
    return Rx.Observable.interval(1000) 
    .map(n => n + start) 
    .take(end - start + 1) 
} 

Và tôi đã có một bài kiểm tra đơn vị đó chạy timeRange (10, 100) và khẳng định giá trị chống lại nó.

Sự cố là khoảng thời gian sẽ làm cho thử nghiệm của tôi quá dài để chạy.

Bạn sẽ giảm khoảng thời gian như thế nào mà không cần chạm vào chính hàm?

Tôi đã thử đọc tài liệu trên lịch nhưng tôi không hiểu.

Trả lời

6

Như vậy là một số khó khăn nhưng bạn có thể kiểm tra chức năng của bạn như sau:

const Rx = require('rxjs'); 
const chai = require('chai'); 

function timeRange(start, end, interval = 1000, scheduler = Rx.Scheduler.async) { 
    return Rx.Observable.interval(interval, scheduler) 
    .map(n => n + start) 
    .take(end - start + 1) 
} 

let scheduler = new Rx.TestScheduler(chai.assert.deepEqual); 
let source = timeRange(2, 8, 50, scheduler); 
let values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8}; 
scheduler.expectObservable(source).toBe('-----2----3----4----5----6----7----(8|)', values); 

scheduler.flush(); 

Một vài điểm cần chú ý:

  • Chức năng có bốn đối số bây giờ. Khoảng thời gian và số Scheduler mà chúng tôi cần sử dụng để chuyển số TestScheduler.

  • TestScheduler cần có phương pháp so sánh sâu đối tượng. Nó sẽ được sử dụng để so sánh các mảng của các đối tượng Notification.

  • Bạn không thể sử dụng 1000 vì thời gian tối đa cho phép là hardcoded as 750. Lưu ý, đây chỉ là thời gian ảo và không liên quan đến thời gian thực nên 50 chúng tôi đang sử dụng trong thử nghiệm này không giống như 50ms. Chúng tôi chỉ cần vừa với khung thời gian đó 750.

  • Sau đó kiểm tra đá cẩm thạch làm thử nghiệm đá cẩm thạch điển hình. Xem https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md để biết thêm thông tin. Chỉ cần lưu ý rằng tôi không thể sử dụng cùng chức năng toàn cầu mocha như các toán tử RxJS mặc định.

  • Tôi cũng phải chỉ định các giá trị vì thử nghiệm bằng đá cẩm thạch theo các chuỗi sử dụng mặc định và tôi cần buộc các số nguyên để đảm bảo sự bình đẳng sâu.

Bạn có thể kiểm tra rằng điều này không bằng cách thay đổi giá trị một cẩm thạch:

let values = {'2': 42, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8}; 

Ngoài ra, bạn có thể xem những gì các đối tượng thông báo là bằng cách in chúng để an ủi:

let scheduler = new TestScheduler((actual, expected) => { 
    console.log('Actual:', actual, '\n\n', 'Expected:', expected); 
    chai.assert.deepEqual(actual, expected); 
}); 

Sử dụng RxJS 5 mocha người trợ giúp

Tại thời điểm này RxJS 5 không phơi bày những người giúp đỡ thử nghiệm mocha. Tôi đang thực sự sử dụng nó trong một dự án khác tôi đang làm việc ngay bây giờ (bao gồm cả việc tạo ra các hình ảnh sơ đồ). Bạn có thể xem ở đây https://github.com/martinsik/rxjs-extra thành package.json tôi đang sử dụng tập lệnh nào. Nó hoạt động tốt nhưng thiết lập hơi khó hiểu. Nó liên quan đến việc tải xuống kho lưu trữ RxJS 5, sao chép một vài tệp và vá nó bằng một số couple of files. Sau đó, các tùy chọn mặc định cho thử nghiệm mocha được thiết lập với mocha.opts được dựa trên bản gốc từ RxJS 5.

2

Bạn tạo TestScheduler hoặc VirtualTimeScheduler và chuyển nó làm đối số thứ hai tùy chọn cho Observable.Interval. Trong trường hợp của bạn, bạn chỉ cần thêm đối số lập lịch tùy chọn vào timeRange và chuyển giá trị vào.

Các trình kiểm tra này cho phép bạn "vượt qua thời gian" mà không phải chờ đợi thời gian thực tế trôi qua.

Để biết thêm thông tin và ví dụ, xem Testing your Rx Application

+0

Xin lỗi tôi nên làm rõ. Tôi đang sử dụng rxjs 5. Bạn có biết tương đương với rxjs 5 không? Các liên kết bạn cung cấp là dành cho rxjs 4. – khoomeister

+0

Không có tài liệu cập nhật nhưng các loại vẫn còn ở đó. Ví dụ. 'nhập {TestScheduler} từ 'rxjs/testing/TestScheduler'' –

3

tôi phải đối mặt với cùng một vấn đề thời gian gần đây và phát hiện ra marble testing cho phép bạn viết bài kiểm tra thị giác tuyệt vời mà làm cho đúng lúc thử nghiệm Quan sát cực kỳ dễ dàng.

Thử nghiệm bằng đá cẩm thạch tóm tắt thời gian và các thử nghiệm chạy ngay lập tức (bằng cách sử dụng TestScheduler dưới mui xe), nhưng bạn vẫn có thể thử nghiệm các quy trình phức tạp theo thời gian. Đây là một thử nghiệm ví dụ để cung cấp cho bạn một ý tưởng về cú pháp:

it('should set up an interval',() => { 
    const expected = '----------0---------1---------2---------3---------4---------5---------6-----'; 
    expectObservable(Observable.interval(100, rxTestScheduler)).toBe(expected, [0, 1, 2, 3, 4, 5, 6]); 
}); 

Đây thực sự là đơn vị kiểm tra chính thức từ cho Observable.interval từ repo rxjs5: https://github.com/ReactiveX/rxjs/blob/master/spec/observables/interval-spec.ts

Kiểm tra các official documentation để biết thêm.

Bắt đầu chạy thử thách một chút, nhưng tất cả những gì bạn cần là hai tệp marble-testing.tstest-helper.ts từ số marble testing example project này.

0

Điều này làm việc tuyệt vời cho tôi: rxjs-testscheduler-compat. Từ README:

rxjs-testscheduler-compat cung cấp giao diện lên lịch kiểm tra RxJS v4 của phiên bản v5 của RxJS cho phép di chuyển các trường hợp kiểm tra hiện với nỗ lực tối thiểu cũng như viết các trường hợp thử nghiệm mới đối với trường hợp nhất định.

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