मोक्स का उपयोग करके यूनिट-टेस्टिंग सर्विस फैब्रिक एप्लिकेशन के बारे में विशिष्ट प्रश्न

Dec 17 2020

यह सवाल एक अनुवर्ती है: लेखन सेवा एक सेवा फैब्रिक अनुप्रयोग वर्ग के लिए

मेरी आवेदन की परिभाषा इस प्रकार की है - मुझे जिन समस्याओं का सामना करना पड़ रहा है उनमें से सबसे बुनियादी को हल करने के लिए इसे सरल बनाया गया है:

namespace SearchService
{
    internal sealed class SearchServiceClass : StatelessService
    {
        //variables defined followed by constructor
        private string jsonStr;
        public SearchServiceClass(StatelessServiceContext context)
            : base(context)
        {
            try
            {
                var dataPackage = Context.CodePackageActivationContext
                .GetDataPackageObject("Data");
                jsonStr = File.ReadAllText(dataPackage.Path + @"\data.json");
            }
            catch
            {
                //exception handling code
                throw;
            }
        }
        
        public bool IsDataJsonLoaded
        {
            get
            {
                return !(jsonStr == null);
            }
        }
    }
}

और परीक्षण वर्ग ऐसा दिखता है:

namespace SearchService.Tests
{
    [TestClass]
    public class SearchServiceClassTest
    {
        [TestMethod]
        public void SearchServiceClassConstructor()
        {
           var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
           Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
        }
    }
}

मुझे जो अपवाद मिला है, वह यह है कि "System.NullReferenceException: ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के इंस्टेंस पर सेट नहीं है। " जो इस तथ्य से उत्पन्न हो रहा है कि "डेटापैकपेज.पैथ" "var dataPackage = प्रसंग" में मान्य मान पर सेट नहीं किया जा रहा है। .कोडपैकएजेशनएक्टेशनकोटेक्स्ट.गेटडॉटपैकेजऑब्जेक्ट ("डेटा"); " रेखा।

मैं मॉक का उपयोग करके CodePackageActivationContext की नकल कैसे करूं? यहां "डेटा" डेटापैकेज को संदर्भित करता है जो "डेटा" नाम से एक फ़ोल्डर है और SearchServiceClass के लिए कोड के साथ रहता है।

जवाब

1 singhh-msft Dec 17 2020 at 17:31

आप लाइन को नकली करने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

अधिक जानकारी के लिए, इसकी जांच करें: यूनिट टेस्ट azure सर्विस फैब्रिक्स के लिए Moq फ्रेमवर्क का उपयोग कैसे करें?

नीचे क्वेरी के लिए:

कुछ और जो मुझे पूरी तरह से समझ में नहीं आ रहे हैं, वे चर और सदस्य वर्ग में बनाए जा रहे हैं, लेकिन इससे पहले कि कंस्ट्रक्टर को बुलाया जाता है। उदाहरण के लिए "निजी स्ट्रिंग jsonStr;" यूनिट टेस्ट में उपद्रव के बिना निष्पादित होने लगता है, भले ही मैं केवल यूनिट टेस्ट में कंस्ट्रक्टर को बुला रहा हूं, और "निजी स्ट्रिंग jsonStr;" कंस्ट्रक्टर के बाहर है। तो क्या कंस्ट्रक्टर के बाहर बनाए गए सभी वेरिएबल्स पर भी यही लागू होगा?

यहाँ, यह एक सरल C # कोड के बारे में है: लाइन में private string jsonStr;, jsonStr को परिभाषित किया गया है। लेकिन, इसे संदर्भित करने से पहले, आपको इसे प्रारंभ करना चाहिए, अन्यथा यह अशक्त संदर्भ त्रुटि को फेंक देगा - जो आप अपने निर्माता में कर रहे हैं।