2008-11-07 9 views
23

में एचटीएमएलहेल्पर का परीक्षण करना क्या है (यूनिट) मेरे स्वयं के एचटीएमएल हेल्पर का परीक्षण करने का कोई तरीका है? यदि मैं कस्टम नियंत्रण (एचटीएमएलहेल्पर द्वारा प्रस्तुत) करना चाहता हूं और मुझे उस नियंत्रण के लिए आवश्यकताएं पता हैं तो मैं पहले परीक्षण कैसे लिख सकता हूं - और फिर कोड लिखें? क्या ऐसा करने के लिए कोई विशिष्ट (अच्छा) तरीका है?एएसपी.नेट एमवीसी

क्या यह लायक है?

उत्तर

30

मुख्य समस्या यह है कि आपको HtmlHelper का नकल करना होगा क्योंकि आप मार्ग या मूल्य प्राप्त करने या किसी अन्य एक्सटेंशन विधि के परिणाम को वापस करने के लिए सहायक के तरीकों का उपयोग कर रहे हैं। एचटीएमएलहेल्पर क्लास में बहुत सारी संपत्तियां हैं और उनमें से कुछ व्यूकॉन्टेक्स्ट या वर्तमान कंट्रोलर जैसी जटिल हैं।

This post from Ben Hart जो बताता है कि मोक के साथ ऐसा नकली कैसे बनाया जाए। आसानी से किसी अन्य नकली ढांचे में अनुवाद किया जा सकता है।

यह मेरा राइनो मोक्स संस्करण एमवीसी फ्रेमवर्क में बदलावों के अनुकूल है। यह पूरी तरह से परीक्षण नहीं है, लेकिन यह मेरे लिए काम कर रहा है लेकिन सही परिणाम की उम्मीद नहीं है:

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData) 
    { 
     var mocks = new MockRepository(); 

     var cc = mocks.DynamicMock<ControllerContext>(
      mocks.DynamicMock<HttpContextBase>(), 
      new RouteData(), 
      mocks.DynamicMock<ControllerBase>()); 

     var mockViewContext = mocks.DynamicMock<ViewContext>(
      cc, 
      mocks.DynamicMock<IView>(), 
      viewData, 
      new TempDataDictionary()); 

     var mockViewDataContainer = mocks.DynamicMock<IViewDataContainer>(); 

     mockViewDataContainer.Expect(v => v.ViewData).Return(viewData); 

     return new HtmlHelper(mockViewContext, mockViewDataContainer); 
    } 
+2

उदासी ब्लॉग पोस्ट त्रुटियों लेकिन इसके बाद के संस्करण काफी अच्छी तरह से आप – MJJames

+1

क्या करने की जरूरत बताते हैं जैसे वे एमवी बदल दिया है लगता है उपरोक्त के बाद से सी फ्रेमवर्क, व्यूकॉन्टेक्स्ट के रूप में अब एक टेक्स्टवाइटर भी लेता है –

+4

यह बहुत उपयोगी है, लेकिन एमवीसी 3 के खिलाफ परीक्षण करने के लिए मुझे mockViewContextConstructor (मैंने 'TextWriter.Null'' का उपयोग करने के लिए एक नया पैरामीटर जोड़कर इसे ट्वीक करना पड़ा था और इसके बजाय mockViewDataContainer, मुझे स्पष्ट रूप से ViewData सेट करना था (उदाहरण के लिए, 'mockViewDataContainer.ViewData = viewData; ') या राइनो मोक्स एक अपवाद फेंकता है। –

0

मैं एक कस्टम सहायक बना रहा हूं, और इस कोड मैं Moq और एएसपी MVC के साथ httphelper उपहास करने के लिए उपयोग कर रहा हूँ है 2. मैं एक पैरामीटर के रूप में भी HttpRequestBase के एक नकली के रूप में गुजर रहा हूँ। आप निकाल सकते हैं कि अगर आप इसकी आवश्यकता नहीं है

 
public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData, Mock requestMock) 
     { 
      var contextBaseMock = new Mock(); 
      contextBaseMock.SetupGet(cb => cb.Request).Returns(requestMock.Object); 

      var cc = new ControllerContext(contextBaseMock.Object, 
              new RouteData(), 
              new Mock().Object); 
      var vctx = new ViewContext(
       cc, 
       new Mock().Object, 
       viewData, 
       new TempDataDictionary(), 
       new HtmlTextWriter(new StreamWriter(new MemoryStream()))); 

      var mockViewDataContainer = new Mock(); 

      mockViewDataContainer.SetupGet(v => v.ViewData).Returns(viewData); 

      return new HtmlHelper(vctx, mockViewDataContainer.Object); 
     } 
9

किसी को भी कैसे HtmlHelper<T> बनाने के लिए (कि क्या मैं के बाद थी) की तलाश में है, तो यहां एक कार्यान्वयन है कि मदद कर सकता है है - मेरी प्रकार एक वर्ग नामित मॉडल है :

public static HtmlHelper<Model> CreateHtmlHelper() 
{ 
    ViewDataDictionary vd = new ViewDataDictionary(new Model()); 

    var controllerContext = new ControllerContext(new Mock<HttpContextBase>().Object, 
                new RouteData(), 
                new Mock<ControllerBase>().Object); 

    var viewContext = new ViewContext(controllerContext, new Mock<IView>().Object, vd, new TempDataDictionary(), new Mock<TextWriter>().Object); 

    var mockViewDataContainer = new Mock<IViewDataContainer>(); 
    mockViewDataContainer.Setup(v => v.ViewData).Returns(vd); 

    return new HtmlHelper<Model>(viewContext, mockViewDataContainer.Object); 
} 

या एक अधिक सामान्य कार्यान्वयन:

public HtmlHelper<T> CreateHtmlHelper<T>() where T : new() 
    { 
     var vd = new ViewDataDictionary(new T()); 

     var controllerContext = new ControllerContext(new Mock<HttpContextBase>().Object, 
                 new RouteData(), 
                 new Mock<ControllerBase>().Object); 

     var viewContext = new ViewContext(controllerContext, new Mock<IView>().Object, vd, new TempDataDictionary(), new Mock<TextWriter>().Object); 

     var mockViewDataContainer = new Mock<IViewDataContainer>(); 
     mockViewDataContainer.Setup(v => v.ViewData).Returns(vd); 

     return new HtmlHelper<T>(viewContext, mockViewDataContainer.Object); 
    } 
संबंधित मुद्दे