2009-04-05 10 views
25

मैं अपने मानक पर कुछ सरल एमएस यूनिट परीक्षण कर रहा हूं, कुछ विशेष नियंत्रक नहीं।यूनिट परीक्षण मेरे नियंत्रक विधि के परिणामस्वरूप एक खाली व्यूनाम में परिणाम?

जब मैं ViewName प्रोपर्टी की जांच करता हूं, तो ViewResult ऑब्जेक्ट से, यह "" (खाली) है।

मुझे लगता है कि ViewNameView (suggested by this MS article के रूप में एएसपी.नेट एमवीसी नियंत्रक परीक्षण पर) के नाम से निहित है।

बीटीडब्ल्यू, जब मैं व्यूडेटा का परीक्षण करता हूं, तो यह सब ठीक और सही है।

यहाँ कोड मैं है ...

public ActionResult Index(int? page, string tag) 
{ 
    if (page == null || page <= 0) 
    { 
     page = 1; 
    } 

    var viewData = new IndexViewData 
         { 
         ... my property setters, etc ... 
         }; 
    return View(viewData); 
} 

[TestMethod] 
public void Index_Action_Should_Return_Index_View_For_Default_HomePage() 
{ 
    // Arrange. 
    var controller = PostController; // Wrapper, cause I use D.I. 

    // Act. 
    ViewResult viewResult = controller.Index(null, null) as ViewResult; 

    // Assert. 
    Assert.IsNotNull(viewResult); 
    Assert.AreEqual("Index", viewResult.ViewName); // This is false/fails. 

    var indexViewData = viewResult.ViewData.Model as IndexViewData; 
    Assert.IsNotNull(indexViewData); // This is true. 
} 

उत्तर

27

ViewName ही मौजूद है जब आप ViewResult में सेट है। यदि आपका व्यू नाम आपके नियंत्रक नाम से मेल खाता है, तो मैं यह सुनिश्चित करने के लिए जांच करूंगा कि व्यूनाम सही या खाली होगा (आईएमओ) सही व्यवहार होगा क्योंकि आप दृश्य पर नाम सेट नहीं करना चाहते हैं। मैं केवल यह जांचता हूं कि व्यूनाम सेट किया गया है जब मेरा इरादा है कि वापस लौटने के लिए दृश्य कार्रवाई से मेल नहीं खाता है - उदाहरण के लिए, "त्रुटि" दृश्य लौटने पर, कहें।

संपादित: निम्नलिखित ViewResultBase.cs में ExecuteResult के लिए स्रोत (RC1 से, मैं अपने Macintosh पर RTW के लिए स्रोत नहीं है) है। जैसा कि आप देख सकते हैं कि यह देखने के लिए जांचें कि क्या व्यूनाम सीधे सेट किया गया है और यदि नहीं, तो यह इसे नियंत्रक संदर्भ के रूट डेटा में कार्रवाई से खींचता है। यह केवल ExecuteResult में होता है, जिसे आपके नियंत्रक की कार्रवाई पूरी होने के बाद बुलाया जाता है।

public override void ExecuteResult(ControllerContext context) { 
     if (context == null) { 
      throw new ArgumentNullException("context"); 
     } 
     if (String.IsNullOrEmpty(ViewName)) { 
      ViewName = context.RouteData.GetRequiredString("action"); 
     } 

     ViewEngineResult result = null; 

     if (View == null) { 
      result = FindView(context); 
      View = result.View; 
     } 

     ViewContext viewContext = new ViewContext(context, View, ViewData, TempData); 
     View.Render(viewContext, context.HttpContext.Response.Output); 

     if (result != null) { 
      result.ViewEngine.ReleaseView(context, View); 
     } 
    } 
+0

हेया। हम्म। मैं जो कह रहा हूं वह आपको नहीं मिलता है। "व्यूनाम केवल तभी मौजूद होता है जब आप इसे ViewResult में सेट करते हैं"। मैंने सोचा कि फ्रेमवर्क ऑटो सेट करता है? क्या आप कह रहे हैं कि यह स्वचालित रूप से सेट नहीं है? –

+0

नहीं। जहां तक ​​मैं व्यूनाम को बता सकता हूं कि जब तक आप इसे विशेष रूप से सेट नहीं करते हैं तब तक शून्य नहीं है। मेरा मानना ​​है कि यदि यह शून्य या खाली है तो यह दृश्य नाम को कार्रवाई के नाम से खींचता है। – tvanfosson

+0

>> मेरा मानना ​​है कि यदि यह शून्य या खाली है तो यह क्रिया के नाम से दृश्य नाम खींचता है। << हम्म .. तो इसका मतलब है कि यह शून्य नहीं होना चाहिए, है ना? –

0

व्यूनाम फ्रेमवर्क द्वारा स्वचालित रूप से सेट किया गया है। लेकिन जब हम यूनिट परीक्षण करते हैं, तो हम ढांचे को शॉर्ट-सर्किट करते हैं और नाम सेट करने के लिए कुछ भी नहीं बचा है।

इसलिए जब हम इकाई परीक्षण करते हैं तो हमारे कार्यों को स्पष्ट रूप से दृश्यनाम सेट करने की आवश्यकता होती है। अगर हम वास्तव में, वास्तव में सम्मेलन पर झुकाव करना चाहते हैं तो हम शून्य या खाली की जांच भी कर सकते हैं।

2

मुझे व्यक्तिगत रूप से एमवीसी 2 द्वारा प्रदान की गई परीक्षण सुविधाओं को कुछ हद तक बेकार पाया गया। मुझे लगता है कि कुछ बेहतर पहले से ही बेहतर है, लेकिन मैं कार्यों का परीक्षण करने के लिए एक साधारण वर्ग बना रहा। मैंने MockRoundTrip नामक उत्कृष्ट ओपन सोर्स Java MVC framework Stripes द्वारा प्रदान की गई कक्षा पर इंटरफेस (कार्यान्वयन एक और कहानी) का मॉडल किया।

यहां क्रियाओं का परीक्षण करते समय कार्य गंतव्य पृष्ठ प्राप्त करने के लिए उपयोग की जाने वाली विधि है, जिसे getTripDestination() कहा जाता है। यह सही परिणाम है कि क्या VIEWNAME स्पष्ट रूप से सेट किया जाता है पर ध्यान दिए बिना या नहीं देता है

//Get the destination page of the request, using Runtime execution pattern of MVC, namely 
    //if no ViewName is explicitly set in controller, ViewResult will have an empty ViewName 
    //Instead, current action name will be used in its place 
    public string getTripDestination() 
    { 
     RouteData routeData = getRouteData(); 
     ViewResult viewResult = (result is ViewResult) ? (ViewResult)result : null; 
     string tripDestination = (viewResult != null) ? viewResult.ViewName : ""; 

     return (tripDestination != "") ? tripDestination : (String)routeData.Values["action"]; 
    } 

    private RouteData getRouteData() 
    { 
     HttpContextBase context = controller.ControllerContext.RequestContext.HttpContext; 
     return RouteTable.Routes.GetRouteData(context); 
    } 
0

documentation for Controller.View() कहता है:

देखें वर्ग का यह तरीका अधिभार एक ViewResult वस्तु एक खाली ViewName है कि रिटर्न संपत्ति। यदि आप नियंत्रक कार्रवाइयों के लिए यूनिट परीक्षण लिख रहे हैं, तो यूनिट परीक्षणों के लिए खाली व्यूनाम संपत्ति को ध्यान में रखें जो स्ट्रिंग व्यू नाम नहीं लेता है।

रन टाइम पर, यदि व्यूनाम संपत्ति खाली है, तो वर्तमान क्रिया नाम व्यूनाम संपत्ति के स्थान पर उपयोग किया जाता है।

तो जब वर्तमान कार्य के समान नाम के साथ एक दृश्य की अपेक्षा करते हैं तो हम केवल यह जांच सकते हैं कि यह एक खाली स्ट्रिंग है।

वैकल्पिक रूप से, नियंत्रक। दृश्य (स्ट्रिंग) विधि व्यूनाम सेट करेगा।

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