2008-09-23 9 views
9

मेरे परीक्षणों में मुझे यह जांचने की आवश्यकता है कि क्या होता है जब ओरेकल एक्सेप्शन फेंक दिया जाता है (संग्रहीत प्रक्रिया विफलता के कारण)। मैंकोई सार्वजनिक कन्स्ट्रक्टर के साथ ओरेकल एक्सेप्शन को सीलबंद/नकली/स्टब कैसे कर सकता हूं?

Expect.Call(....).Throw(new OracleException()); 

करने के लिए सेटअप राइनो Mocks कोशिश कर रहा हूँ जो भी कारण तथापि के लिए, OracleException कोई सार्वजनिक निर्माता के साथ बंद किया जा रहा है। इसका परीक्षण करने के लिए मैं क्या कर सकता हूं?

संपादित करें: यहाँ है कि मैं क्या दृष्टांत कोशिश कर रहा हूँ ठीक है:

public sealed class OracleException : DbException { 
    private OracleException(string message, int code) { ...} 
} 

उत्तर

3

ऐसा लगता है कि ओरेकल बाद के संस्करणों में उनके कंस्ट्रक्टर्स बदल गया है, इसलिए समाधान ऊपर काम नहीं करेगा।

आप केवल त्रुटि कोड सेट करना चाहते हैं, निम्नलिखित 2.111.7.20 के लिए चाल करना होगा:

ConstructorInfo ci = typeof(OracleException) 
      .GetConstructor(
       BindingFlags.NonPublic | BindingFlags.Instance, 
       null, 
       new Type[] { typeof(int) }, 
       null 
       ); 

Exception ex = (OracleException)ci.Invoke(new object[] { 3113 }); 
-1

आप एक छोटी सी संग्रहीत प्रक्रिया है कि विफल रहता है/त्रुटियों हर बार लिख सकते हैं, तो वह परीक्षण करने के लिए उपयोग करते हैं?

+2

का उपयोग कर मैं नहीं चाहता डेटाबेस हिट करने के लिए समाप्त हो गया चाहता था प्राप्त करने के लिए हर बार! –

2

OracleException ऑब्जेक्ट को तुरंत चालू करने के लिए प्रतिबिंब का उपयोग करें? OracleException का दृष्टांत को साथ

object[] args = ... ; 
(OracleException)Activator.CreateInstance(typeof(OracleException), args) 
+0

ऐसा लगता है कि यह काम करेगा, मैं कन्स्ट्रक्टर तर्क कैसे निर्दिष्ट करूं? –

+0

एक्टिवेटर। क्रिएट इंस्टेंस (टाइपऑफ (ओरेकल एक्सेप्शन), नई ऑब्जेक्ट [] {yourParams}); –

+0

ugh, निजी पैरामीटर के लिए काम नहीं करता –

3

उपयोग प्रतिबिंब

new OracleException() 

बदलें। देखें this blog post

5

यहाँ तुम कैसे करते है:

ConstructorInfo ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {typeof(string), typeof(int)}, null); 
    var c = (OracleException)ci.Invoke(new object[] { "some message", 123 }); 

सभी कि मदद के लिए धन्यवाद, आप

1

अच्छा समाधान जॉर्ज upvoted की है। यह भी बहुत SqlException के लिए काम करता है:

 ConstructorInfo ci = typeof(SqlErrorCollection).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null); 
     SqlErrorCollection errorCollection = (SqlErrorCollection) ci.Invoke(new object[]{}); 

     ci = typeof(SqlException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string), typeof(SqlErrorCollection) }, null); 
     return (SqlException) ci.Invoke(new object[] { "some message", errorCollection }); 

-डेव

3

मैं Oracle.DataAccess.Client डेटा प्रदाता ग्राहक का उपयोग कर रहा हूँ। मुझे ओरेकलएक्सप्शन ऑब्जेक्ट का एक नया उदाहरण बनाने में परेशानी हो रही है, लेकिन यह मुझे बताती है कि कोई सार्वजनिक निर्माता नहीं है। मैंने ऊपर दिखाए गए सभी विचारों को आजमाया और शून्य संदर्भ अपवाद प्राप्त किया।

object[] args = { 1, "Test Message" }; 
ConstructorInfo ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic 
    | BindingFlags.Instance, null, System.Type.GetTypeArray(args), null); 
var e = (OracleException)ci.Invoke(args); 

परीक्षण कोड डीबग करते समय, मुझे हमेशा 'सीआई' के लिए एक पूर्ण मूल्य मिलता है।

क्या ओरेकल ने लाइब्रेरी को बदलने की अनुमति देने के लिए बदल दिया है? मैं गलत क्या कर रहा हूं और एनएमॉक के साथ उपयोग करने के लिए ओरेकल एक्सेप्शन ऑब्जेक्ट को चालू करने के लिए मुझे क्या करने की ज़रूरत है?

वैसे, मैं संस्करण 10 जी के लिए क्लाइंट लाइब्रेरी का उपयोग कर रहा हूं।

धन्यवाद,

चार्ली

5

दैवज्ञ की कामयाब डेटा का उपयोग (v 4.121.1 लिए।0) निर्माता फिर से

var ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(int), typeof(string), typeof(string), typeof(string) }, null); 
var c = (OracleException)ci.Invoke(new object[] { 1234, "", "", "" }); 
+0

मैं ddtek 4.2.0.0 के लिए इसे कैसे कर सकता हूं? मैं refleciton करने के लिए नया हूँ और मैं किसी भी रचनाकारों की पहचान नहीं कर सकता – Tomas

2

बदल तुम हमेशा Oracle.DataAccess 4.112.3.0 के लिए यह

ConstructorInfo[] all = typeof(OracleException).GetConstructors(
    BindingFlags.NonPublic | BindingFlags.Instance);` 

की तरह सभी कंस्ट्रक्टर्स प्राप्त कर सकते हैं इस लौटे 7 कंस्ट्रक्टर्स

enter image description here

एक मैं सूची में दूसरा स्थान चाहता था जिसमें 5 तर्क, int, string, string, string, int लगे। मैं पांचवें तर्क से आश्चर्यचकित था क्योंकि ILSpy में यह इस

internal OracleException(int errCode, string dataSrc, string procedure, string errMsg) 
{ 
    this.m_errors = new OracleErrorCollection(); 
    this.m_errors.Add(new OracleError(errCode, dataSrc, procedure, errMsg)); 
} 

तो की तरह दिखाई देता, निर्माता मुझे लगता है मैं

ConstructorInfo constructorInfo = 
    typeof(OracleException).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance, 
    null, 
    new Type[] { typeof(int), typeof(string), typeof(string), typeof(string), typeof(int) }, 
    null);` 
संबंधित मुद्दे

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