मैं Reactive Extensions for .NET (Rx) का उपयोग IObservable<T>
के रूप में ईवेंट को बेनकाब करने के लिए कर रहा हूं। मैं एक यूनिट टेस्ट बनाना चाहता हूं जहां मैं जोर देता हूं कि एक विशेष घटना निकाल दी जाती है। यहां कक्षा का एक सरलीकृत संस्करण है जिसे मैं परीक्षण करना चाहता हूं:प्रतिक्रियाशील एक्सटेंशन का उपयोग कर किसी ईवेंट के लिए यूनिट परीक्षण
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();
}
}
स्पष्ट रूप से मेरे वास्तविक वर्ग अधिक जटिल हैं। मेरा लक्ष्य यह सत्यापित करना है कि परीक्षा के तहत कक्षा के साथ कुछ क्रियाएं करने से IObservable
पर संकेतित घटनाओं का अनुक्रम होता है। सौभाग्य से मैं कक्षाओं को IDisposable
लागू करना चाहता हूं और इस विषय पर OnCompleted
पर कॉल करना जब ऑब्जेक्ट का निपटारा किया जाता है, तो परीक्षण करना बहुत आसान हो जाता है।
// Arrange
var classUnderTest = new ClassUnderTest();
var eventFired = false;
classUnderTest.SomethingHappened.Subscribe(_ => eventFired = true);
// Act
classUnderTest.DoSomething();
// Assert
Assert.IsTrue(eventFired);
अगर एक घटना निकाल दिया जाता है नहीं बहुत बुरा है निर्धारित करने के लिए एक चर का उपयोग करना है, लेकिन और अधिक जटिल स्थितियों में इस बात की पुष्टि करने के लिए कि घटनाओं की एक विशेष अनुक्रम हैं चाहते हो सकता है:
यहाँ मैं कैसे परीक्षण है निकाल दिया। क्या यह चर में घटनाओं को रिकॉर्ड किए बिना और फिर चर पर दावा करने के बिना संभव है? IObservable
पर दावा करने के लिए एक धाराप्रवाह LINQ- जैसे वाक्यविन्यास का उपयोग करने में सक्षम होने से उम्मीद है कि परीक्षण अधिक पठनीय होगा।
बीटीडब्ल्यू, मुझे लगता है कि एक चर होना पूरी तरह से अच्छा है। उपरोक्त कोड पढ़ने में आसान है, जो सबसे महत्वपूर्ण है। @ पीएल का जवाब अच्छा और सुरुचिपूर्ण है, लेकिन आपको यह समझने के लिए दबाव डालना होगा कि क्या हो रहा है ... शायद इसे एक एक्सटेंशन में बदल दें FailIfNothingHappened() –
@ सर्गी एल्डौखोव: मैं सहमत हूं, लेकिन पीएल के जवाब ने मुझे सीखा कि मैं ' मेरा 'IObservable' कैसे व्यवहार करता है इस बारे में कारण बताएं। और जो हुआ उससे कब्जा करने के लिए चर का उपयोग करके अधिक जटिल परीक्षणों के लिए समझना मुश्किल हो सकता है। साथ ही, जैसा कि आप सुझाव देते हैं, एक एक्सटेंशन बनाना शायद यह समझना आसान हो जाएगा कि क्या हो रहा है। –
मैंने अपने प्रश्न को और अधिक स्पष्ट करने के लिए संपादित किया है जो मैं चाहता हूं। –