2009-09-07 21 views
34

का उपयोग करता है मैं एक ऐसी कार्रवाई User.Identity.Name पर निर्भर करता है उसके आदेशों की एक सूची प्राप्त करने के लिए वर्तमान उपयोगकर्ता के उपयोगकर्ता नाम प्राप्त करना:परीक्षण नियंत्रक कार्रवाई User.Identity.Name

public ActionResult XLineas() 
    { 
     ViewData["Filtre"] = _options.Filtre; 
     ViewData["NomesPendents"] = _options.NomesPendents; 
     return View(_repository.ObteLiniesPedido(User.Identity.Name,_options.Filtre,_options.NomesPendents)); 
    } 

अब मैं मैं इसके लिए यूनिट परीक्षण लिखने की कोशिश कर रहा हूं, लेकिन मैं उपयोगकर्ता के लिए एक नकली प्रदान करने के तरीके पर अटक गया हूं। Identity.Name। यदि मैं अपना परीक्षण चलाता हूं क्योंकि मेरे पास है (उपयोगकर्ता के लिए नकली के बिना ...), मुझे एक नल .. अपवाद मिलता है।

इसके लिए सही दृष्टिकोण कौन सा है? मैं सोच रहा हूं कि मेरा एक्शन कोड यूनिट परीक्षण के लिए अच्छा नहीं है।

उत्तर

21

यह कर होगा की एक बेहतर तरीका (, या एक IPrincipal तर्क user तुम सिर्फ नाम से अधिक जानकारी की जरूरत है, तो) एक string तर्क userName पारित करने के लिए एक सामान्य अनुरोध में ActionMethod, जो आपको "इंजेक्षन" करने के लिए एक का उपयोग कर ActionFilterAttribute। जब आप इसका परीक्षण करते हैं, तो आप केवल अपनी खुद की नकली वस्तु की आपूर्ति करते हैं, क्योंकि एक्शन फ़िल्टर का कोड नहीं चलाया जाएगा (ज्यादातर मामलों में - यदि आप विशेष रूप से करना चाहते हैं तो इसके तरीके हैं ...)

काज़ी मांज़ुर राशिद इसका वर्णन करता है excellent blog post में बिंदु 7 के तहत विवरण।

+0

ग्रेट। मुझे एक्शनफिल्टर में और देखना है ... धन्यवाद। –

+0

मैं अक्सर अपने परीक्षणों के लिए आईपीआर प्रिंसिपल का मज़ाक उड़ाता हूं। यह मुझे उपयोगकर्ता सूचनाओं (उपयोगकर्ता नाम) का परीक्षण करने की अनुमति देता है लेकिन प्राधिकरण (User.Identity.IsInRole) भी। –

+1

तो मैं करता हूं। दूसरी तरफ, वर्तमान उपयोगकर्ता के उपयोगकर्ता नाम तक पहुंच प्राप्त करने के लिए आईप्रिनिपियर का मज़ाक उड़ा रहा है - और * कुछ नहीं * अन्य - ओवरकिल के किनारे पर है ... :) –

62

आप इस कोड

public SomeController CreateControllerForUser(string userName) 
{ 
    var mock = new Mock<ControllerContext>(); 
    mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName); 
    mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true); 

    var controller = new SomeController(); 
    controller.ControllerContext = mock.Object; 

    return controller; 
} 

यह Moq मजाक फ्रेमवर्क का उपयोग करते उपयोग कर सकते हैं, लेकिन यकीन है कि आप अपनी पसंद के कुछ भी उपयोग कर सकते हैं।

+0

किसी और के लिए, मेरे जैसे, जो सोच रहा था: यह कोड नमूना [Moq] (https://code.google का उपयोग करता है। com/p/moq /) –

+2

वेबएपीआई में मुझे यह '' MyController नियंत्रक = नया MyController(); नियंत्रक.उसर = नया जेनेरिक प्रिंसिपल (नया जेनेरिक इडेंटिटी (उपयोगकर्ता नाम, "पासपोर्ट"), नया [] {"परीक्षक "});' – Ravi

+0

@ रवि कैसे ? [Controller.User सेटटेबल नहीं है] (https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.user) (हालांकि यह पिछले 2.5 वर्षों में बदल सकता है) – Wolfzoon

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