मौलिक सवाल यह है कि मैं एक यूनिट टेस्ट कैसे बना सकता हूं जिसे किसी विधि को कॉल करने की आवश्यकता होती है, परीक्षण कक्षा पर होने वाली घटना के लिए प्रतीक्षा करें और फिर किसी अन्य विधि को कॉल करें (जिसे हम वास्तव में परीक्षण करना चाहते हैं)?टीडीडी असीमित घटनाओं को कैसे करें?
यहाँ परिदृश्य है अगर आप आगे पढ़ने के लिए समय:
मैं हार्डवेयर का एक टुकड़ा नियंत्रित करने के लिए है कि एक आवेदन के विकास कर रहा हूँ। हार्डवेयर उपलब्धता से निर्भरता से बचने के लिए, जब मैं अपना ऑब्जेक्ट बनाता हूं तो मैं निर्दिष्ट करता हूं कि हम परीक्षण मोड में चल रहे हैं। जब ऐसा होता है, तो जिस वर्ग का परीक्षण किया जा रहा है वह उपयुक्त ड्राइवर पदानुक्रम बनाता है (इस मामले में हार्डवेयर ड्राइवरों की पतली नकली परत)।
कल्पना कीजिए कि प्रश्न में वर्ग एक लिफ्ट है और मैं उस विधि का परीक्षण करना चाहता हूं जो मुझे लिफ्ट की मंजिल संख्या देता है। यहाँ कैसे मेरी काल्पनिक परीक्षण अभी की तरह लग रहा है:
[TestMethod]
public void TestGetCurrentFloor()
{
var elevator = new Elevator(Elevator.Environment.Offline);
elevator.ElevatorArrivedOnFloor += TestElevatorArrived;
elevator.GoToFloor(5);
//Here's where I'm getting lost... I could block
//until TestElevatorArrived gives me a signal, but
//I'm not sure it's the best way
int floor = elevator.GetCurrentFloor();
Assert.AreEqual(floor, 5);
}
संपादित करें:
सभी प्रश्नों के उत्तर के लिए धन्यवाद। इस प्रकार मैंने इसे कार्यान्वित करने का अंत किया:
[TestMethod]
public void TestGetCurrentFloor()
{
var elevator = new Elevator(Elevator.Environment.Offline);
elevator.ElevatorArrivedOnFloor += (s, e) => { Monitor.Pulse(this); };
lock (this)
{
elevator.GoToFloor(5);
if (!Monitor.Wait(this, Timeout))
Assert.Fail("Elevator did not reach destination in time");
int floor = elevator.GetCurrentFloor();
Assert.AreEqual(floor, 5);
}
}
क्या लक्ष्य ओएस पर कॉल अवरुद्ध होने जा रहे हैं? –
नहीं। जैसे ही आप कॉल करते हैं .GoToFloor (मंजिल) यह लौटाता है, लेकिन लिफ्ट "स्थानांतरण" में स्थिति बदलती है, उस मंजिल तक पहुंचने में कुछ समय लगता है, और फिर यह एक घटना (जो एक अलग धागे में हो सकता है) उठाएगा –
हाय, यह एक समस्या को हल करना चाहिए जिसमें मैंने एक असीमित ऑपरेशन का परीक्षण किया है। मैंने उपरोक्त कोड को शुरुआती बिंदु के रूप में उपयोग किया है, हालांकि मॉनिटर.पल्स लॉक को पुनः प्राप्त करने का इंतजार नहीं करता है और यह बार-बार आर्टर्ट का कारण बनता है। विफल ("ईवेंट नहीं आया") आग लगाना। कोई विचार यह क्यों हो सकता है ...! – Kildareflare