ASP.NET WebApi इकाई का अनुरोध के साथ परीक्षण। CreateResponse


147

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

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

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


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

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

1
ठीक है, मुझ पर शर्म करो, मुझे बस यह लिखने की जरूरत है। Request.CreateResponse (HttpStatusCode.Accepted, createProduct, GlobalConfiguration.Configuration)
asa

जवाबों:


243

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

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 भी काम करता है।
आसा

4
GlobalConfiguration.Configuration को जोड़ना अभी भी बाकी है। अनुरोध सेट करना मेरे लिए काम करता है, हालाँकि यह मेरी समस्याओं का अंत नहीं था क्योंकि मेरा एक्शन भी Url कह रहा था। लिंक और मार्ग का नाम परिभाषित नहीं किया गया था।
मूर्ख


इस कॉल के बाद कंट्रोलर कॉन्टेक्स्ट सेट करना मुझे वह त्रुटि देता है, लेकिन केवल WebApi 5.0.0 के साथ। लेकिन अगर मैं पिछले अनुरोध पर HttpConfiguration ऑब्जेक्ट सेट करता हूं , तो यह ठीक काम करता है।
mikebridge

यह पूरी तरह से काम करता है, लेकिन मैं यह समझने में विफल हूं कि यह क्यों काम करता है। क्या आप इसका उत्तर में बता सकते हैं?
Jan_V

24

आप इस तरह परीक्षण क्षमता के लिए नियंत्रक वस्तु स्थापित कर सकते हैं:

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;

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


1
आपको इससे संबंधित एमएस डॉक्स में भी रुचि हो सकती है: docs.microsoft.com/en-us/aspnet/web-api/overview/… आपको System.Web.Http और System.Net पर भी संदर्भ जोड़ना पड़ सकता है। एचटीटीपी
आरोन हॉफमैन

4

वेब एपीआई 2 के लिए, आप बस जोड़ सकते हैं

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

इस तरह

[TestMethod]
public void GetReturnsProduct()
{
    // Arrange
    var controller = new ProductsController(repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    // Act
    var response = controller.Get(10);

    // Assert
    Product product;
    Assert.IsTrue(response.TryGetContentValue<Product>(out product));
    Assert.AreEqual(10, product.Id);
}

नियंत्रक पर अनुरोध और कॉन्फ़िगरेशन सेट करना महत्वपूर्ण है। अन्यथा, परीक्षण ArgumentNullException या InvalidOperationException के साथ विफल हो जाएगा।

अधिक जानकारी के लिए यहां देखें ।


1

WebBI 1 यहाँ VB का उपयोग करते हुए एक समान मुद्दे के साथ है।

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

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());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.