एक .NET कोर MVC नियंत्रक के परीक्षण के लिए Mock HttpContext?


93

मेरे पास एक नियंत्रक में एक फ़ंक्शन है जो मैं यूनिट परीक्षण कर रहा हूं जो http अनुरोध के हेडर में मूल्यों की अपेक्षा करता है। मैं HttpContext को प्रारंभ नहीं कर सकता क्योंकि यह आसानी से है।

मेरा नियंत्रक फ़ंक्शन "डिवाइस-आईडी" के लिए http अनुरोध शीर्ष लेख मान की अपेक्षा करता है

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();

    //not valid controller.HttpContext is readonly
    //controller.HttpContext = new DefaultHttpContext(); 

    var result = controller.Get();
    Assert.AreEqual(result.Count(), 2);
}

क्या किसी तीसरे पक्ष के पुस्तकालय का उपयोग किए बिना ऐसा करने का सीधा-सीधा तरीका है?


1
HttpContext का उपयोग करें? नियंत्रकों का उपयोग करने का पूरा बिंदु यह है कि डेटा नियंत्रक के मापदंडों के माध्यम से आता है। यदि आपका नियंत्रक डेटा को पढ़ने के लिए HttpContext का उपयोग करता है जैसे कि यह एक WebForms पृष्ठ था, तो आपको एक समस्या है।
पनियागोटिस कानावोस

@PanagiotisKanavos हेडर में मूल्य सूचना का एक टुकड़ा है जो यह दर्शाता है कि कॉल किस मोबाइल डिवाइस से आती है। यह सही डेटा पुनर्प्राप्त करने के लिए नेकसरी है। डिवाइस आईडी हेडर में है क्योंकि प्रमाणीकरण के लिए आईडी की आवश्यकता होती है, जिसे एक कस्टम एक्शन फ़िल्टर द्वारा नियंत्रित किया जाता है। मैं डिवाइस आईडी को मार्ग पैरामीटर के रूप में पारित कर सकता था लेकिन यह बेमानी होगा
जेम्स विर्ज़बा

FromHeaderAttribute की जाँच करें, लेकिन डुप्लिकेट की भी जाँच करें। अब विन्यास के माध्यम से HttpContext इंजेक्टेबल है
Panagiotis Kanavos

1
मेरा सुझाव है कि आप अपना प्रश्न संपादित करें कि आप क्या चाहते हैं (मोबाइल उपकरणों की पहचान करने के लिए हेडर फ़ील्ड तक पहुंच)। ASP.NET दस्तावेज़ीकरण एक .... "संक्रमण" अवधि से गुजर रहा है जो इसे कृपया डाल दें, प्रलेखन पृष्ठ गायब हैं। इस लगभग समान प्रश्न की जाँच करें जो पूछता है कि मोबाइल उपकरणों को कैसे रूट किया जाए
Panagiotis Kanavos

जवाबों:


224

मैं इस तरह httpcontext और हैडर को इनिशियलाइज़ करने में सक्षम था:

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    controller.ControllerContext = new ControllerContext();
    controller.ControllerContext.HttpContext = new DefaultHttpContext();
    controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317";
    var result = controller.Get();
    //the controller correctly receives the http header key value pair device-id:20317
    ...
}

20

HTTPContext का मजाक उड़ाने के बजाय, हेडर को विधि में किसी पैरामीटर में मैप करना शायद एक बेहतर विचार है। उदाहरण के लिए, इस उत्तर के तल पर नियंत्रक में, idपैरामीटर को "डिवाइस-आईडी" के बराबर नाम के साथ मान हेडर पर सेट किया जाता है ... इकाई परीक्षण तब बन जाता है

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    var result = controller.GetHeaderValue("27");
    Assert.AreEqual(result, "27");
}

जबकि आप HttpContext का मज़ाक उड़ा सकते हैं , मेरी राय में यह कुछ ऐसा है जिसे तब तक टाला जाना चाहिए जब तक आपके पास कोई विकल्प न हो। FromHeaderAttribute के लिए प्रलेखन यहाँ FromHeaderAttribute वर्ग से पाया जा सकता है ।

public class ValuesController: Controller
{
    public string GetHeaderValue([FromHeader(Name = "device-id")] string id)
    {
        return id;
    }
}

1
मेरे मामले में, IIRC, इसे http हेडर में शामिल करने की आवश्यकता थी क्योंकि उसी मूल्य को एक .net कोर मिडिलवेयर घटक
जेम्स विर्ज़बा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.