2012-06-03 4 views
126

के साथ एएसपी.NET वेबएपीआई यूनिट परीक्षण मैं अपने एपीकंट्रोलर के लिए कुछ यूनिट परीक्षण लिखने की कोशिश कर रहा हूं और कुछ मुद्दों का सामना कर रहा हूं। Request.CreateResponse नामक एक अच्छी एक्सटेंशन विधि है जो प्रतिक्रिया उत्पन्न करने में बहुत मदद करती है।Request.CreateResponse

public HttpResponseMessage Post(Product product) 
{ 
    var createdProduct = repo.Add(product); 
    return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct); 
} 

आंशिक mocks का उपयोग कर या "नया HttpResponseMessage (...)" के प्रत्यक्ष का उपयोग किए बिना CreateResponse उपहास करने के लिए कोई तरीका है?

+1

क्यों आप उपहास करने के लिए 'CreateResponse' चाहते हो? वापस लौटे 'HttpResponseMessage'' Content' और 'StatusCode' गुणों पर जोर क्यों न दें जो सही मान सेट हैं? – nemesv

+3

यदि मैं इस विधि फॉर्म इकाई परीक्षण चलाता हूं, तो यह अपवाद के साथ विफल हो जाएगा कि कॉन्फ़िगरेशन सेट नहीं है। – asa

+1

ठीक है, मुझ पर शर्म की बात है, मुझे बस इसे लिखने की ज़रूरत है। Reequest.CreateResponse (HttpStatusCode.Accepted, madeProduct, GlobalConfiguration.Configuration) – asa

उत्तर

215

इस हल करने के लिए एक और तरीका है निम्न करने के लिए है:

controller.Request = new HttpRequestMessage(); 
controller.Request.SetConfiguration(new HttpConfiguration()); 

कारण है कि: यदि आप 5.0 WebAPI को अद्यतन कर रहे हैं

controller.Request = new HttpRequestMessage(); 
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, 
            new HttpConfiguration()); 

, तो आप को यह को बदलना होगा आपको ऐसा करने की ज़रूरत है क्योंकि आपको नियंत्रक पर Request पॉप्युलेट करना होगा अन्यथा Request पर एक्सटेंशन विधियां काम नहीं करेंगी। अनुरोध पर सेट HttpConfiguration आपके पास अन्यथा रूटिंग और पाइपलाइन के अन्य हिस्सों को सही ढंग से कार्य नहीं करेगा।

+0

हां, यह भी काम कर सकता है, लेकिन ऐसा लगता है कि अनुरोध। क्रेट रेस्पॉन्स भी काम करता है। – asa

+4

ग्लोबल कॉन्फ़िगरेशन जोड़ना। कॉन्फ़िगरेशन अभी भी अनुरोध को शून्य छोड़ दिया है। अनुरोध स्थापित करना मेरे लिए काम करता था, हालांकि यह मेरी समस्याओं का अंत नहीं था क्योंकि मेरी कार्रवाई यूआरएल को भी बुला रही थी। लिंक और मार्ग का नाम परिभाषित नहीं किया गया था। – foolshat

+0

मार्ग स्थापित करने में सहायता http://stackoverflow.com/questions/11779311/testing-webapi-controller-url-link – foolshat

20

आप इस तरह testability के लिए नियंत्रक वस्तु सेट कर सकते हैं:

var config = new HttpConfiguration(); 
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products"); 
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); 
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } }); 

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

Unit Testing ASP.NET Web API पर पीटर प्रोवोस्ट के व्यापक ब्लॉग पोस्ट से कॉपी किया गया।

0

वेबएपीआई 1 यहां वीबी का उपयोग कर एक समान समस्या के साथ।

मैं यहाँ संकर प्रतिक्रियाओं में कामयाब रहे इस इस के रूप में सरल काम करने के लिए प्राप्त करने के लिए:

Dim request As HttpRequestMessage = New HttpRequestMessage() 
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration) 

शायद ज़रुरत पड़े पोस्टिंग यह किसी को भी मदद करता है।

0

अपनी परीक्षा कक्षा में, नियंत्रक वर्ग का एक उदाहरण बनाएं। , उदा, var customerController= new CustomerController();

customerController.Request = new HttpRequestMessage(); 
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); 
संबंधित मुद्दे