Tôi đang sử dụng Reactive Extensions for .NET (Rx) để hiển thị sự kiện dưới dạng IObservable<T>
. Tôi muốn tạo một bài kiểm tra đơn vị nơi tôi khẳng định rằng một sự kiện cụ thể được kích hoạt. Đây là phiên bản đơn giản của lớp tôi muốn kiểm tra:Thử nghiệm đơn vị cho một sự kiện sử dụng Tiện ích mở rộng phản ứng
public sealed class ClassUnderTest : IDisposable {
Subject<Unit> subject = new Subject<Unit>();
public IObservable<Unit> SomethingHappened {
get { return this.subject.AsObservable(); }
}
public void DoSomething() {
this.subject.OnNext(new Unit());
}
public void Dispose() {
this.subject.OnCompleted();
}
}
Rõ ràng các lớp thực của tôi phức tạp hơn. Mục tiêu của tôi là xác minh rằng việc thực hiện một số hành động với lớp đang được kiểm tra dẫn đến một chuỗi các sự kiện được báo hiệu trên IObservable
. May mắn là các lớp tôi muốn thử nghiệm thực hiện IDisposable
và gọi OnCompleted
về chủ đề khi đối tượng được xử lý làm cho nó dễ dàng hơn nhiều để kiểm tra.
Sau đây là cách tôi thử nghiệm:
// Arrange
var classUnderTest = new ClassUnderTest();
var eventFired = false;
classUnderTest.SomethingHappened.Subscribe(_ => eventFired = true);
// Act
classUnderTest.DoSomething();
// Assert
Assert.IsTrue(eventFired);
Sử dụng một biến để xác định xem một sự kiện là bắn không phải là quá xấu, nhưng trong tình huống phức tạp hơn tôi có thể muốn xác minh rằng một chuỗi sự kiện cụ là Bị sa thải. Có phải là có thể mà không cần ghi lại các sự kiện trong các biến và sau đó thực hiện các xác nhận về các biến? Có thể sử dụng một cú pháp LINQ giống như thông thạo để thực hiện các xác nhận trên IObservable
hy vọng sẽ làm cho bài kiểm tra dễ đọc hơn.
BTW, tôi nghĩ rằng có một biến là hoàn toàn tốt. Đoạn mã trên dễ đọc, điều quan trọng nhất. Câu trả lời của @ PL là tốt đẹp và thanh lịch, nhưng bạn phải căng thẳng để hiểu những gì đang xảy ra ... Có thể biến nó thành một phần mở rộng FailIfNothingHappened() –
@Sergey Aldoukhov: Tôi đồng ý, nhưng câu trả lời của PL đã học được cách tôi có thể sử dụng ' Materialize' để lý do về cách hoạt động 'IObservable' của tôi. Và đối với các thử nghiệm phức tạp hơn, sử dụng các biến để nắm bắt những gì đã xảy ra có thể khó hiểu hơn. Ngoài ra, việc tạo một tiện ích mở rộng như bạn đề xuất có thể sẽ giúp bạn hiểu điều gì đang diễn ra dễ dàng hơn. –
Tôi đã chỉnh sửa câu hỏi của mình để làm rõ hơn những gì tôi muốn. –