2011-06-29 9 views
6

मैं एक ऐसी कक्षा का परीक्षण करने के लिए एनयूनीट और मोक का उपयोग कर रहा हूं जिसमें कुछ घटनाएं हैं और मैं यह जांचने का सबसे अच्छा तरीका खोजने की कोशिश कर रहा हूं कि कोई ईवेंट निकाल दिया गया था या नहीं। मैं इस समाधान के साथ आया लेकिन यह थोड़े गंदे लगता है क्योंकि मुझे परीक्षण के लिए एक इंटरफ़ेस बनाना है। किसी भी तरह से मैं कम कोड के साथ एक ही चीज़ कर सकता हूं या इंटरफ़ेस बनाना नहीं है?एनयूनीट और मोक का उपयोग कर यूनिट परीक्षण कार्यक्रमों के लिए बेहतर तरीका?

यह बुरा नहीं है लेकिन मुझे लगता है कि किसी के पास बेहतर समाधान हो सकता है। किसी भी विचार की सराहना की जाती है। धन्यवाद।

[Test] 
    public void StartedAndStoppedEventsShouldFireWhenStartedAndStopped() 
    { 
     var mockStartedEventSubscriber = new Mock<IEventSubscriber>(); 
     var mockStoppedEventSubscriber = new Mock<IEventSubscriber>(); 

     _NetworkMonitor.Started += mockStartedEventSubscriber.Object.Handler; 
     _NetworkMonitor.Stopped += mockStoppedEventSubscriber.Object.Handler; 

     _NetworkMonitor.Start(); 
     _NetworkMonitor.Stop(); 

     Func<bool> func =() => { return (eNetworkMonitorStatus.Stopped == _NetworkMonitor.Status); }; 
     Utilities.WaitUntilTrue(func, _NetworkMonitor.Interval * 2, 10); 

     _NetworkMonitor.Started -= mockStartedEventSubscriber.Object.Handler; 
     _NetworkMonitor.Stopped -= mockStoppedEventSubscriber.Object.Handler; 

     mockStartedEventSubscriber.Verify(h => h.Handler(_NetworkMonitor, EventArgs.Empty), Times.Once()); 
     mockStoppedEventSubscriber.Verify(h => h.Handler(_NetworkMonitor, EventArgs.Empty), Times.Once()); 
    } 

    public interface IEventSubscriber 
    { 
     void Handler(object sender, EventArgs e); 
    } 

उत्तर

4

यह परीक्षण बिना मोजे के करना आसान लगता है। एक घटना ग्राहक के रूप में परीक्षण स्थिरता डबल बनाओ।

_networkMonitor.Started += this.SetStartedFlag; // a private method which sets a flag in the test fixture. 
_networkMonitor.Start(); 
Assert.That(StartedFlag, Is.True); 
+0

मैं प्रत्येक घटना मैं परीक्षण था के लिए एक नया झंडा और नई विधि बनाने के लिए होगा। वह बहुत अधिक ब्लोट जोड़ देगा। इस उदाहरण में मैं एक ही इंटरफ़ेस का उपयोग कर सकता हूं। लेकिन मैं देख रहा हूँ कि आप क्या कह रहे हैं। –

+0

@Dusty Lau - आप एक सामान्य ध्वज (अधिसूचना प्राप्त) और हैंडलर का उपयोग कर सकते हैं क्योंकि आप परीक्षण करना चाहते हैं कि यह ईवेंट ट्रिगर किया गया है। यदि आप एक इंटरफ़ेस का परीक्षण कर रहे थे उदा। INotifyPropertyChanged, आप एक उपयोगिता वर्ग PropertyChangeListener लिख सकते हैं जो इंटरफेस के किसी भी कार्यान्वयन के साथ काम किया। – Gishu

0

नीचे एक तरह का स्निपेट है जिसे मैंने अतीत में अच्छे प्रभाव के लिए उपयोग किया है। यह केवल ईवेंट (मेरे मामले में) कनेक्शन की गणना करता है, चेंजएडएन्ट आर्ट्स को एक सूची <> प्रत्येक बार ईवेंट निकाल दिया जाता है। इस पर जोर दिया जाता है कि कितनी घटनाओं को निकाल दिया गया था। उम्मीद है कि आपको यह विचार मिल जाएगा और यदि आप चाहें तो इसे अपनी जरूरतों के अनुसार अनुकूलित कर सकते हैं।

[Test] 
public void GoodConnectionRaisesConnectionChangedEvent() 
{ 
    const int EXPECTED = 1; 
    List<ConnectionChangedEventArgs> ev = new List<ConnectionChangedEventArgs>(); 

    // Mocks and setup stuff here... 

    using (PlcController pc = new PlcController(mock.Object)) 
    { 
     pc.ConnectionChanged += delegate(object sender, ConnectionChangedEventArgs e) 
     { 
      ev.Add(e); 
     }; 

     pc.Connect(); 
    } 

    Assert.That(ev.Count, Is.EqualTo(EXPECTED)); 
} 
+0

एक डाउन वोट मैं संभाल सकता हूं, लेकिन कृपया टिप्पणी क्यों करें! – Andy

3

मुझे लगता है कि आपको इसके लिए moq की आवश्यकता नहीं है। तुम बस की घटनाओं के लिए रजिस्टर कर सकते हैं और मूल्यांकन अगर वे निकाल दिया गया है (या समय की संख्या वे निकाल दिया गया):

public class NetworkMonitor 
    { 
     public event EventHandler Started; 
     public event EventHandler Stopped; 

     public void Start() 
     { 
      var handler = Started; 
      if (handler != null) 
       handler(this, EventArgs.Empty); 
     } 

     public void Stop() 
     { 
      var handler = Stopped; 
      if (handler != null) 
       handler(this, EventArgs.Empty); 
     } 

    } 

    [Test] 
    public void StartedAndStoppedEventsShouldFireWhenStartedAndStopped() 
    { 

     NetworkMonitor classUnderTest = new NetworkMonitor(); 
     bool startedWasFired = false; 
     int stoppedWasFired = 0; 
     classUnderTest.Started += (o, e) => { startedWasFired = true; }; 
     classUnderTest.Stopped += (o, e) => { stoppedWasFired++; }; 

     classUnderTest.Start(); 
     Assert.That(startedWasFired); 
     classUnderTest.Stop(); 
     Assert.That(stoppedWasFired, Is.EqualTo(1)); 
    } 
संबंधित मुद्दे