जैसा कि हेनक ने पहले ही नोट किया है, यूआई को दबाकर बेकार है, क्योंकि आप चाहते हैं कि आपका कोड असफल हो। आप अपने कोड को बदलने के लिए नहीं करना चाहते हैं, तो आप इस प्रकार, एक कस्टम ट्रेस श्रोता कि एक अपवाद फेंकता लिख सकते हैं:
public class ProductionTraceListener : DefaultTraceListener
{
public override void Fail(string message, string detailMessage)
{
string failMessage = message;
if (detailMessage != null)
{
failMessage += " " + detailMessage;
}
throw new AssertionFailedException(failMessage);
}
}
[Serializable]
public class AssertionFailedException : Exception
{
public AssertionFailedException() { }
public AssertionFailedException(string message) : base(message) { }
public AssertionFailedException(string message, Exception inner)
: base(message, inner) { }
protected AssertionFailedException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
}
और आप इसे रजिस्टर कर सकते हैं इस प्रकार है:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace>
<listeners>
<clear />
<add name="Default"
type="[Namespace].ProductionTraceListener, [Assembly]" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
आप के रूप में पहले से ही ट्रेस श्रोता के नाम ProductionTraceListener
से उम्मीद कर सकते हैं, मैं अपने उत्पादन वातावरण (वेब अनुप्रयोग) में उस चीज़ का उपयोग करता हूं, न कि मेरे यूनिट परीक्षणों में। जबकि आप अपने यूनिट परीक्षणों में इस चाल का उपयोग कर सकते हैं, मैं सलाह देता हूं कि आप अपना कोड बदल दें। आईएमओ आपको केवल कोड पथों के लिए आवेषण का उपयोग करना चाहिए जो कभी नहीं चलना चाहिए, और यदि वे करते हैं, तो परीक्षण विफल होना चाहिए। आपकी स्थिति में जब आप एक असफल असफल हो जाते हैं, तो आप एक सफल परीक्षण करना चाहते हैं, जो प्रतिद्वंद्वी है।
मेरी सलाह कोड बदलने के लिए और पूर्व शर्त के लिए सामान्य if (x) throw ArgumentException()
चेकों का उपयोग (या CuttingEdge.Conditions का उपयोग) और उन केवल कोड रास्तों कि कभी नहीं चलाना चाहिए के लिए दावा करते हैं। Debug.Assert
के बजाय Trace.Assert
का उपयोग करने का प्रयास करें, क्योंकि आप यह भी चाहते हैं कि उन आवेषणों को आपके उत्पादन वातावरण में जांचें। जब आपने ऐसा किया है तो आप अपने उत्पादन वातावरण में ProductionTraceListener
और अपने यूनिट परीक्षणों में यह UnitTestTraceListener
का उपयोग कर सकते हैं।
public class UnitTestTraceListener : DefaultTraceListener
{
public override void Fail(string message, string detailMessage)
{
string failMessage = message;
if (detailMessage != null)
{
failMessage += " " + detailMessage;
}
// Call to Assert method of used unit testing framework.
Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail(
failMessage);
}
}
शुभकामनाएँ।
यह Trace.Assert() के लिए अच्छा लगेगा, लेकिन ओपी Debug.Assert() का उल्लेख करता है। –
प्लस, आप एक स्वचालित बिल्ड प्रोसेस के हिस्से के रूप में चलते समय यूनिट परीक्षण * में कोड विफल होने के लिए चाहते हैं। कोड चलाने के दौरान डेवलपर्स लाभ के लिए आवेषण हैं। – Rob
@ हेंक एंड @ @ रोब: मुझे यकीन नहीं है कि मैं आपका अनुसरण करता हूं। इकाई परीक्षण पर्यावरण में 'ProductionTraceListener' को कॉन्फ़िगर करने से यूनिट परीक्षण विफल होने की अनुमति होगी जब विधियों ने अपेक्षित' AssertionFailedException' को फेंक नहीं दिया था। जब यूनिट परीक्षण डीबग मोड में चलाए जाते हैं तो यह वैसे ही करेगा जैसा वह चाहता है, है ना? कृपया मुझे ज्ञान दो। – Steven