2009-02-26 14 views
10

निष्पादन फ़िल्टरकॉन्टेक्स्ट पर आधारित कुछ आंतरिक स्थिति सेट करने के लिए मैंने अपने नियंत्रक की ऑनएक्शन एक्स्क्रिप्टिंग विधि को ओवरराइड कर दिया है। मैं इसका परीक्षण कैसे करूं? विधि स्वयं ही संरक्षित है इसलिए मुझे लगता है कि मुझे कॉल स्टैक में ऊपर जाना होगा।मैं अपने एएसपीनेट-एमवीसी नियंत्रक की ऑनएक्शन एक्सेलिंग विधि का परीक्षण कैसे करूं?

मुझे इसका परीक्षण करने के लिए किस कोड की आवश्यकता है?

मैं MVC आर सी का उपयोग कर रहा 1.

संपादित करें: मैं भी nunit उपयोग कर रहा हूँ।

धन्यवाद

उत्तर

15

आपको एक निजी एक्सेसर जोड़ने और उपयोग करने की आवश्यकता है। अपने कंट्रोलर क्लास में राइट क्लिक करें और मेनू से Create Private Accessors चुनें और उन्हें अपनी टेस्ट प्रोजेक्ट में जोड़ें। एक बार अपनी टेस्ट प्रोजेक्ट में, अपना कंट्रोलर बनाएं, फिर उसके लिए एक एक्सेसर बनाएं। विधि एक्सेसर पर उपलब्ध होना चाहिए।

/// <summary> 
///A test for OnActionExecuting 
///</summary> 
[TestMethod()] 
[ExpectedException(typeof(InvalidOperationException))] 
public void OnActionExecutingWindowsIdentityTest() 
{ 
    var identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    var httpContext = MockRepository.GenerateStub<HttpContextBase>(); 
    httpContext.User = principal; 

    var actionDescriptor = MockRepository.GenerateStub<ActionDescriptor>(); 

    RouteData routeData = new RouteData(); 

    BaseController controller = new BaseController(); 
    BaseController_Accessor accessor = new BaseController_Accessor(new PrivateObject(controller)); 
    ControllerContext controllerContext = MockRepository.GenerateStub<ControllerContext>(httpContext, routeData, controller); 

    ActionExecutingContext filterContext = new ActionExecutingContext(controllerContext, actionDescriptor, new Dictionary<string, object>()); 

    accessor.OnActionExecuting(filterContext); 

} 

संपादित:: यहाँ अपने खुद के कोड से एक नमूना परीक्षण है कि आपको अपनी इकाई परीक्षण के लिए MSTest का उपयोग नहीं कर रहे हैं, तो आप हाथ से accessors उत्पन्न करने के लिए हो सकता है। अनिवार्य रूप से, आप एक रैपर वर्ग बनाते हैं जो समकक्ष सार्वजनिक तरीकों के माध्यम से कक्षा के निजी/संरक्षित तरीकों का परीक्षण करता है, रैपर को परीक्षण के तहत कक्षा का एक उदाहरण पास करता है, और उसके बाद रैपर वर्ग से प्रतिबिंब का उपयोग निजी/संरक्षित करने के लिए करता है परीक्षण के तहत कक्षा पर विधि।

public class MyClass 
    { 
     protected void DoSomething(int num) 
     { 
     } 
    } 

    public class MyClass_accessor 
    { 
     private MyClass privateObj; 

     public MyClass_accessor(MyClass obj) 
     { 
      this.privateObj = obj; 
     } 

     public void DoSomething(int num) 
     { 
      MethodInfo info = privateObj.GetType() 
             .GetMethod("DoSomething", 
                BindingFlags.NonPublic 
                | BindingFlags.Instance); 

      info.Invoke(obj,new object[] { num }); 
     } 
    } 
+0

क्या यह एमएसटीएस्ट विशिष्ट है? मैं नुनिट और xunit एटीएम का उपयोग कर रहा हूँ। –

+0

मैं केवल इसलिए पूछता हूं क्योंकि मुझे 'एड एक्सेसर' संदर्भ बटन नहीं दिख रहा है और एक Google खोज करने से मुझे कुछ एमएस परीक्षण विशिष्ट सामग्री में लाया जाता है। –

+0

हाँ, मुझे लगता है कि यह है। मुझे लगता है कि इसके लिए कम से कम वीएस प्रो की आवश्यकता है। हालांकि आप हाथ से एक बना सकते हैं और अंतर्निहित निजी ऑब्जेक्ट पर उचित विधि का आह्वान करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। – tvanfosson

4

मुझे हाल ही में एक ही समस्या थी और संतोषजनक समाधान नहीं मिला। इसलिए मैंने अपना स्वयं का सहायक कार्य बनाया जो ऑनएक्शन एक्स्क्टेड और ऑनएक्शन एक्स्क्रिप्टिंग का आह्वान करता है। मैं यह करने के कोशिश कर रहा था यहाँ कोड http://mkramar.blogspot.com.au/2012/06/onactionexecuting-and-onactionexecuted.html

+0

ध्यान दें कि स्वीकृत उत्तर में * कोड और स्पष्टीकरण * शामिल है, और इसमें कोई स्वयं-प्रचार लिंक नहीं है? यहां स्वीकार्य उत्तरों के लिए यह पैटर्न है। –

+0

मुझे दूसरे को काम करने के लिए नहीं मिला। लेकिन आपका कोड काम करता है। शायद मुझे आपके answere को संपादित करना चाहिए और अपना कोड जोड़ना चाहिए। मैंने http://stackoverflow.com/a/10316899/648076 के साथ अपना कोड जोड़ा। अब परीक्षण असली अच्छा लग रहा है। –

0

देखें, लेकिन मैं वास्तव में परीक्षण करना चाहता था कस्टम के परिणाम का श्रेय के रूप में यह वास्तविक नियंत्रक के लिए आवेदन किया। हमारे मामले में हमारे पास एक प्राधिकरण विशेषता थी जो नियंत्रक पर गुण सेट करता था, नियंत्रक ने गुणों का उपयोग किया था। हमारे कोड इस तरह दिखता है:

// Create the controller to test 
PortalController controller = new PortalController(); 
var method = typeof(PortalController); 
var attribute = method.GetCustomAttributes(typeof(OrganizationContextFilter),true).Cast<OrganizationContextFilter>().SingleOrDefault(); 

// Set the controller Context with our fake objects on it 
controller.ControllerContext = this.GetDefaultControllerMock(controller); 

// Execute the Organization Context Filter 
var actionDescriptor = new Mock<ActionDescriptor>(); 
var context = Mock.Get(actionDescriptor.Object); 
context.Setup(s => s.ControllerDescriptor).Returns(new Mock<ControllerDescriptor>().Object); 

// Use the current controller Context 
ActionExecutingContext filterContext = new ActionExecutingContext(controller.ControllerContext, actionDescriptor.Object, new Dictionary<string, object>()); 
attribute.OnActionExecuting(filterContext); 

// We have to use this one, because it has the result of the Attribute execution 
PortalController pc = filterContext.Controller as PortalController; 
ActionResult result = pc.MethodToTest(); // Call the controller that had OnActionExecuting results 

इस का लाभ यह है कि हम वास्तव में नियंत्रक हम वास्तव में परीक्षण कर रहे हैं पर कस्टम MVC विशेषता पर अमल है। यह दोनों कस्टम विशेषता कोड का उपयोग करता है और नियंत्रक को ऐसी परिस्थिति में परीक्षण करता है जो "वास्तविक दुनिया" जैसा अधिक है।

+0

तथ्य के 2 साल बाद बस एक त्वरित प्रश्न - एक व्युत्पन्न विशेषता के माध्यम से एक नियंत्रक संपत्ति कैसे सेट करता है? – VisualBean

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

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