c# - Request.CreateResponse के साथ ASP.NET WebApi इकाई परीक्षण





unit-testing asp.net-web-api mocking httpresponse (5)


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

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

यदि आप वेबपी 5.0 में अपग्रेड कर रहे हैं, तो आपको इसे बदलना होगा:

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

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

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

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

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




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

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

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

अगर किसी की मदद करता है तो बस पोस्ट करना।




आप इस तरह की टेस्टेबिलिटी के लिए नियंत्रक ऑब्जेक्ट सेट अप कर सकते हैं:

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;

यूनिट परीक्षण एएसपी.नेट वेब एपीआई पर पीटर प्रोवोस्ट के व्यापक ब्लॉग पोस्ट से कॉपी किया गया।




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

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



वेबएपीआई में सामग्री बातचीत पर नज़र डालें। ये ( भाग 1 और भाग 2 ) आश्चर्यजनक रूप से विस्तृत और पूरी तरह से ब्लॉग पोस्ट बताते हैं कि यह कैसे काम करता है।

संक्षेप में, आप सही हैं, और केवल Accept या Content-Type अनुरोध शीर्षलेख सेट करने की आवश्यकता है। आपके एक्शन को एक विशिष्ट प्रारूप को वापस करने के लिए कोड नहीं किया गया है, आप Accept: application/json कर सकते हैं Accept: application/json





c# unit-testing asp.net-web-api mocking httpresponse