2008-10-10 7 views
9

मैं विजुअल स्टूडियो 2008 के अंदर एमएसटीईटी का उपयोग कर रहा हूं। मेरे पास एक निश्चित टेस्ट क्लास एक्ट में प्रत्येक यूनिट टेस्ट विधि कैसे हो सकती है जैसे कि यह चलाने के लिए पहला टेस्ट था ताकि प्रत्येक वैश्विक स्थिति प्रत्येक परीक्षण चलाने से पहले रीसेट हो जाए? मैं स्पष्ट रूप से TestInitialize, ClassInitialize, AssemblyInitialize, आदि का उपयोग कर उदाहरण के लिए दुनिया को साफ नहीं करना चाहती:चलने से पहले सभी सिंगलेट/स्टेटिक्स को रीसेट करने के लिए एमएसटीएस्ट टेस्ट विधि को कैसे बल दें?

[TestClass] 
public class MyClassTests 
{ 
    [TestMethod] 
    public void Test1() 
    { 
     // The "Instance" property creates a new instance of "SomeSingleton" 
     // if it hasn't been created before. 
     var i1 = SomeSingleton.Instance; 
     ... 
    } 
    [TestMethod] 
    public void Test2() 
    { 
     // When I select "Test1" and "Test2" to run, I'd like Test2 
     // to have a new AppDomain feel so that the static variable inside 
     // of "SomeSingleton" is reset (it was previously set in Test1) on 
     // the call to ".Instance" 
     var i2 = SomeSingleton.Instance; 
     // some code 
    } 

हालांकि एक similar question इस विषय पर दिखाई दिया, तो वह केवल स्पष्ट किया कि परीक्षण समानांतर में नहीं चलाते। मुझे एहसास है कि परीक्षण क्रमशः चलते हैं, लेकिन प्रत्येक विधि (या सभी राज्यों को साफ़ करने के बराबर कुछ) के लिए एक नए ऐपडोमेन को स्पष्ट रूप से मजबूर करने का एक तरीका प्रतीत नहीं होता है।

आदर्श रूप में, मैं अपने यूनिट परीक्षणों के केवल एक छोटे से सबसेट के लिए यह व्यवहार निर्दिष्ट करना चाहता हूं ताकि मुझे उन परीक्षणों के लिए एक नई ऐपडोमेन निर्माण का जुर्माना नहीं देना पड़े जो वैश्विक स्थिति की परवाह नहीं करते हैं (मेरे परीक्षणों का विशाल बहुमत)।

उत्तर

6

अंत में, मैंने एक सहायक लिखा जो AppDomain.CreateDomain का उपयोग करता था और फिर यूनिट परीक्षण को एक अलग ऐपडोमेन के तहत कॉल करने के लिए प्रतिबिंब का उपयोग करता था। यह मुझे आवश्यक अलगाव प्रदान करता है।

This post एमएसडीएन के मंचों पर दिखाता है कि यदि आपके पास केवल कुछ स्थिरताएं हैं जिन्हें रीसेट करने की आवश्यकता है तो स्थिति को कैसे संभालना है। It कुछ विकल्पों का उल्लेख करता है (उदाहरण के लिए प्रतिबिंब और PrivateType का उपयोग करना)।

मुझे किसी और विचार का स्वागत करना जारी है, खासकर अगर मुझे एमएसटीईटी के बारे में कुछ याद आ रहा है।

+2

क्या आपके पास कोड उदाहरण जेफ है? – DevDave

+1

हां, एक कोड नमूना कृपया – Harindaka

0

हमारे एमएसटीस्ट के साथ एक समान समस्या उत्पन्न हुई थी। हमने इसे आवश्यक परीक्षणों की शुरुआत और अंत में एक फ़ंक्शन को कॉल करके इसे संभाला।

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

मुझे यकीन नहीं है कि यह सहायक है, लेकिन इसी तरह हमने इसी तरह के मुद्दे के आसपास काम किया।

+0

ऐसा लगता है कि आप [testInitialize] का उपयोग करने में सक्षम हो सकते हैं आपकी परीक्षा कक्षा में? –

0

मुझे लगता है कि आप TestIntialize विशेषता और TestCleanUp विशेषता की तलाश में हैं। यहां एक एमएसडीएन ब्लॉग है जो निष्पादन आदेश link text

+0

उत्तर के लिए धन्यवाद। मैं ऐसा कुछ ढूंढ रहा था जो प्रत्येक चर को स्पष्ट रूप से स्पष्ट किए बिना दुनिया को साफ कर दे, लेकिन मुझे यकीन नहीं है कि यह संभव है या नहीं। –

3

सिंगलटन इंस्टेंस को हटाने के लिए प्रतिबिंब का उपयोग करने वाले आपके परीक्षणों में एक सहायक जोड़ें (आप सिंगलटन में रीसेट विधि भी जोड़ सकते हैं, लेकिन मैं इसके उपयोग के बारे में चिंतित हूं)। कुछ की तरह:

public static class SingletonHelper { 
      public static void CleanDALFactory() 
      { 
        typeof(DalFactory) 
         .GetField("_instance",BindingFlags.Static | BindingFlags.NonPublic) 
         .SetValue(null, null); 
      } 
} 

अपने TestInitialize विधि में इस लिए बुलाया गया। [मुझे पता है कि यह "दुनिया को साफ करना" है, लेकिन आपको केवल एक हेल्पर प्रति सिंगलटन में विधि लिखना है, यह बहुत छोटा है और आपको स्पष्ट नियंत्रण देता है]

+0

उत्तर के लिए धन्यवाद। मुझे लगता है कि मुझे स्थैतिक क्षेत्रों पर पुनरावृत्ति के संयोजन का उपयोग करना होगा और मोटे तौर पर आप यहां क्या वर्णन करेंगे। इसे पुन: प्रयोज्य बनाने के लिए "NullifyStaticFields (Type T)" की तरह कुछ –

संबंधित मुद्दे