2012-02-24 10 views
13

में दिखाया गया है जैसा कि नीचे दिखाया गया है, मैं एक नकली सेट अप कर रहा हूं। यह लक्ष्य के निर्माता में पारित किया जाता है। लक्ष्य में एक डिक्रिप्ट विधि है जिसे लक्ष्य के जीवनकाल में दो बार बुलाया जाता है। प्रत्येक बार डिक्रिप्ट विधि कहलाती है, यह उस प्रमाणपत्र का निपटान करती है जो सेटअप में "नया" है। हालांकि, दूसरी बार डिक्रिप्ट ऑब्जेक्ट को कॉल करते समय, मुझे डिक्रिप्शन का प्रयास करने पर ऑब्जेक्ट डिस्प्लेज्ड विधि मिल रही है। यदि मैं इस मॉक को ICertificateHelperAdapter के नकली कार्यान्वयन के साथ प्रतिस्थापित करता हूं जो GetCertificate() को कॉल करता है, तो डिक्रिप्ट के लिए दूसरा कॉल ठीक से काम करता है।बाद में एक मॉक .etup परिणाम को उसी ऑब्जेक्ट इंस्टेंस में

मैं यह कह रहा हूं कि जब मैं मॉक का उपयोग करता हूं, तो यह मुझे GetCertificate के बाद की कॉल पर ऑब्जेक्ट का एक नया उदाहरण नहीं लौटा रहा है। क्या यह डिजाइन द्वारा है?

private Mock<ICertificateHelperAdapter> GetCertificateHelperAdapter() 
    { 
     Mock<ICertificateHelperAdapter> certificateHelper = new Mock<ICertificateHelperAdapter>(); 

     certificateHelper.Setup(
      ch => ch.GetCertificate(CertStoreName.My, StoreLocation.LocalMachine, It.IsAny<string>())).Returns(this.GetCertificate()).Verifiable(); 
     return certificateHelper; 
    } 

    private X509Certificate2 GetCertificate() 
    { 
     return new X509Certificate2(Environment.CurrentDirectory + "\\" + "azureconfig.pfx", "dingos"); 
    } 

उत्तर

16

Returns<T> के विभिन्न भार के dirrently बर्ताव करता है:

T Returns<T>(T value) तुम क्या प्रयोग कर रहे हैं हमेशा एक ही उदाहरण लौटा रहा है के साथ एक।

लेकिन एक आलसी संस्करण है जो Func<T> का उपयोग करता है। वे T Returns<T>(Func<T> value) की तरह दिखते हैं और जब सेटअप विधि कहलाती है तो वे प्रत्येक बार पैरामीटर फ़ंक्शन का मूल्यांकन करेंगे। Moq site से

नमूना:

// lazy evaluating return value 
mock.Setup(foo => foo.GetCount()).Returns(() => count); 

बदलें करने के लिए अपने स्थापना:

certificateHelper.Setup(ch => 
    ch.GetCertificate(CertStoreName.My, StoreLocation.LocalMachine, It.IsAny<string>())) 
.Returns(() => this.GetCertificate()).Verifiable(); //note the lambda in Returns 

और यह आपके GetCertificate() दो बार कॉल करेंगे।

+0

यह काम नहीं कर रहा है अगर मैं गुणों को सेट कर रहा हूं और तरीकों से नहीं। – Raj