2013-03-14 10 views
5

मुझे .NET वेब एपी के साथ बहुत अधिक अनुभव नहीं है, लेकिन मैं थोड़ी देर के साथ काम कर रहा हूं, जॉन पापा के एसपीए एप्लिकेशन ट्यूटोरियल पर Pluralsight पर। एप्लिकेशन ठीक काम करता है, लेकिन जिस चीज से मैं अभी संघर्ष कर रहा हूं, यूनिट परीक्षण पोस्ट-कंट्रोलर है।यूनिट परीक्षण पोस्ट नियंत्रक .NET वेब एपी

मैंने यूनिट परीक्षण वेब एपीआई नियंत्रकों के बारे में इस अविश्वसनीय मार्गदर्शिका का पालन किया है। मेरे लिए एकमात्र समस्या तब होती है जब POST विधि का परीक्षण करने की बात आती है।

मेरे नियंत्रक इस तरह दिखता है:

[ActionName("course")] 
    public HttpResponseMessage Post(Course course) 
    { 
     if (course == null) 
      throw new HttpResponseException(HttpStatusCode.NotAcceptable); 
     try 
     { 
      Uow.Courses.Add(course); 
      Uow.commit(); 
     } 
     catch (Exception) 
     { 
      throw new HttpResponseException(HttpStatusCode.InternalServerError); 
     } 

     var response = Request.CreateResponse(HttpStatusCode.Created, course); 

     string uri = Url.Link(routeName: "ControllerActionAndId", 
     routeValues: new { id = course.Id }); 

     response.Headers.Location = new Uri(uri); 

     return response; 
    } 

और मेरी इकाई परीक्षण इस तरह दिखता है:

public static void SetupPostControllerForTest(ApiController controller) 
    { 

     var config = new HttpConfiguration(); 
     var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/courses/course"); 
     var route = config.Routes.MapHttpRoute(
      name: "ControllerActionAndId", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: null, 
      constraints: new { id = @"^\d+$" } 
     ); 

     var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "courses" }, { "action", "course" } }); 

     controller.ControllerContext = new HttpControllerContext(config, routeData, request); 
     controller.Request = request; 
     controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 
    } 

जब मैं इकाई परीक्षण डिबग:

[Test] 
    public void PostShouldReturnHttpResponse() 
    { 
     var populatedPostController = new CoursesController(new TestUOW()); 

     SetupPostControllerForTest(populatedPostController); 

     var course = new Course 
     { 
      Id = 12, 
      Author = new UserProfile() 
      { 
       Firstname = "John", 
       Lastname = "Johnson", 
      }, 
      Description = "Testcourse", 
      Title = "Test Title" 
     }; 

      var responses = populatedPostController.Post(course); 

      ObjectContent content = responses.Content as ObjectContent; 
      Course result = (Course)content.Value; 
      Assert.AreSame(result, course); 
    } 
मदद समारोह के साथ

, ऐसा लगता है:

 string uri = Url.Link(routeName: "ControllerActionAndId", 
     routeValues: new { id = course.Id }); 

     response.Headers.Location = new Uri(uri); //Exception because uri = null 

यह यूआरएल जैसा लगता है। लिंक मार्ग नहीं ढूंढ सकता है।

मैंने this मार्गदर्शिका को भी कोशिश की, लेकिन मैं वास्तव में उदाहरण के ऊपर काम करना चाहता हूं।

क्या मुझे यहां कुछ मूलभूत याद आ रही है?

+1

अपने 'सेटअपपॉस्टकंट्रोलरफॉरटेस्ट विधि' नियंत्रक के अंत में निम्न पंक्ति जोड़ने का प्रयास करें। अनुरोध। प्रॉपर्टीज [एचटीपीप्रोपर्टीकीके। एचटीपीआरओटीडेटाकी] = रूटडाटा; ' – nemesv

+0

हाँ, यह अब काम करता है! जब आप थके हुए होते हैं तो यही होता है .. धन्यवाद! –

उत्तर

4

हां, आप कॉन्फ़िगरेशन में एक पंक्ति को याद कर रहे हैं क्योंकि नेमेस ने उल्लेख किया था।

controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData 

जैसा कि आप देख सकते हैं, केवल UrlHelper का उपयोग करने के लिए नियंत्रक को कॉन्फ़िगर करना बेहद जटिल है। मैं उस कारण से नियंत्रक कक्षाओं में UrlHelper के उपयोग से बचने के लिए जाते हैं। मैं आम तौर पर एक IUrlHelper की तरह परीक्षण को आसान बनाने के लिए बाहरी निर्भरता पेश करता हूं, जो मुझे यूनिट परीक्षण में व्यवहार का नकल करने की अनुमति देता है।

public interface IUrlHelper 
    { 
     string Link(string routeName, object routeValues); 
     string Route(string routeName, object routeValues); 
    } 

    public class UrlHelperWrapper : IUrlHelper 
    { 
     UrlHelper helper; 

     public UrlHelperWrapper(UrlHelper helper) 
     { 
      this.helper = helper; 
     } 

     public string Link(string routeName, object routeValues) 
     { 
      return this.helper.Link(routeName, routeValues); 
     } 

     public string Route(string routeName, object routeValues) 
     { 
      return this.helper.Route(routeName, routeValues); 
     } 
    } 

मैं वास्तविक वेब एपीआई में इस UrlHelperWraper, और परीक्षण में IUrlHelper इंटरफ़ेस का एक नकली इंजेक्षन। ऐसा करके, आपको मार्गों के साथ उस जटिल कॉन्फ़िगरेशन की आवश्यकता नहीं है।

सम्मान, पाब्लो।

+0

वाह। मैं इसे कैसे याद कर सकता हूं: /। UrlHelper को संभालने के लिए एक और अधिक साफ तरीका लगता है। अच्छा है, धन्यवाद! –

+0

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

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