8

मैं ASP.NET MVC Beta 1 पर स्कॉट गुथरी के उत्कृष्ट पद के माध्यम से अपना रास्ता काम कर रहा हूं। इसमें वह UpdateModel विधि में किए गए सुधारों को दिखाता है और वे यूनिट परीक्षण में सुधार कैसे करते हैं। मैंने एक समान प्रोजेक्ट को फिर से बनाया है, हालांकि जब भी मैं यूनिटटेस्ट चलाता हूं जिसमें अपडेटमोडेल को कॉल किया जाता है, तो मुझे नियंत्रक कॉन्टेक्स्ट पैरामीटर नामकरण एक ArgumentNullException प्राप्त होता है।मैं अद्यतन मॉडेल का उपयोग करने वाले मॉकिंग के बिना यूनिट टेस्ट एक्शन कैसे करूं?

यहाँ प्रासंगिक बिट है, अपने मॉडल के साथ शुरू:

public class Country { 
    public Int32 ID { get; set; } 
    public String Name { get; set; } 
    public String Iso3166 { get; set; } 
} 

नियंत्रक कार्रवाई:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Int32 id, FormCollection form) 
{ 
    using (ModelBindingDataContext db = new ModelBindingDataContext()) { 
    Country country = db.Countries.Where(c => c.CountryID == id).SingleOrDefault(); 

    try { 
     UpdateModel(country, form); 

     db.SubmitChanges(); 

     return RedirectToAction("Index"); 
    } 
    catch { 
     return View(country); 
    } 
    } 
} 

और अंत में मेरी इकाई परीक्षण है कि नाकाम रहने है:

[TestMethod] 
public void Edit() 
{ 
    CountryController controller = new CountryController(); 
    FormCollection form = new FormCollection(); 
    form.Add("Name", "Canada"); 
    form.Add("Iso3166", "CA"); 

    var result = controller.Edit(2 /*Canada*/, form) as RedirectToRouteResult; 

    Assert.IsNotNull(result, "Expected to be redirected on successful POST."); 
    Assert.AreEqual("Show", result.RouteName, "Expected to redirect to the View action."); 
} 

ArgumentNullException फेंक दिया जाता है संदेश के साथ UpdateModel पर कॉल करके "मूल्य शून्य नहीं हो सकता है। पी arameter नाम: नियंत्रक कॉन्टेक्स्ट "। मुझे लगता है कि कहीं UpdateModel को System.Web.Mvc.ControllerContext की आवश्यकता है जो परीक्षण के निष्पादन के दौरान मौजूद नहीं है।

मैं भी यह सोचते हैं रहा है कि मैंने कुछ गलत कर रहा हूँ कहीं और सिर्फ सही दिशा में इशारा किया की जरूरत है।

कृपया मदद करें!

उत्तर

5

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

protected internal bool TryUpdateModel<TModel>(...) where TModel : class 
{ 

    .... 

    ModelBindingContext bindingContext = 
      new ModelBindingContext(ControllerContext, 
            valueProvider, 
            typeof(TModel), 
            prefix, 
            () => model, 
            ModelState, 
            propertyFilter); 

    ... 
} 
+1

मैं मानता हूं, मैं इसे मजाक कर हल कर सकता हूं, लेकिन यह स्पष्ट रूप से अद्यतन करता है कि स्कॉट अपने अपडेट में अपडेटमोडेल उदाहरणों के संदर्भ में क्या कहता है: "हमें ऊपर दिए गए फॉर्म सबमिशन परिदृश्यों के यूनिट परीक्षण में कुछ भी नकल करने की आवश्यकता नहीं थी। " –

+0

मैंने TryUpdateModel (जो UpdateModel उपयोग करता है) के स्रोत को देखा और यह निश्चित रूप से ControllerContext का उपयोग करता है। मैंने रिलावंट सोर्स कोड बिट के साथ अपनी प्रतिक्रिया अपडेट की है। – tvanfosson

+0

@ हेल्फ़फायर, मैंने ब्लॉग पोस्ट पर एक टिप्पणी देखी जिसने संकेत दिया कि कम से कम एक अन्य व्यक्ति को एक ही त्रुटि हो रही है। यह हो सकता है कि बीटा 1 दरवाजा बाहर निकलने से पहले मॉडल बाइंडिंग कॉन्टेक्स्ट बदल गया। – tvanfosson

0

या आप प्रपत्र डेटा प्रॉक्सी बना सकते हैं,

तरह
public class CountryEdit { 
    public String Name { get; set; } 
    public String Iso3166 { get; set; } 
} 
    :

    var routeData = new RouteData(); 
    var httpContext = MockRepository.GenerateStub<HttpContextBase>(); 
    FormCollection formParameters = new FormCollection(); 
    
    EventController controller = new EventController(); 
    ControllerContext controllerContext = 
        MockRepository.GenerateStub<ControllerContext>(httpContext, 
                    routeData, 
                    controller); 
    controller.ControllerContext = controllerContext; 
    
    ViewResult result = controller.Create(formParameters) as ViewResult; 
    
    Assert.AreEqual("Event", result.Values["controller"]); 
    Assert.AreEqual("Show", result.Values["action"]); 
    Assert.AreEqual(0, result.Values["id"]); 
    

    यहाँ www.codeplex.com/aspnet पर Controller.cs स्रोत से प्रासंगिक सा

  • प्लस। आसान बनाने इकाई परीक्षण
  • प्लस। पोस्ट
  • प्लस से फ़ील्ड अपडेट की सफेद सूची को परिभाषित करें। आसान सेटअप सत्यापन नियम, इसे आसान परीक्षण।
  • माइनस। आप प्रॉक्सी से तारीख बढ़ना चाहिए आप

मॉडल करने के लिए तो Controller.Action दिखना चाहिए, जैसे

public ActionResult Edit(Int32 id, CountryEdit input) 
{ 
    var Country = input.ToDb(); 
    // Continue your code 
} 
2

मैं इस एक ही मुद्दा रहा था। Tvanfosson के समाधान को पढ़ने के बाद, मैंने एक साधारण समाधान की कोशिश की जिसमें नकली ढांचे शामिल नहीं हैं।

CountryController controller = new CountryController(); 
controller.ControllerContext = new ControllerContext(); 

यह जबकि इकाई परीक्षण मेरे लिए ठीक त्रुटि हटाया: इस प्रकार

नियंत्रक करने के लिए डिफ़ॉल्ट ControllerContext जोड़ें। मुझे उम्मीद है कि यह किसी और की मदद कर सकता है।