অনুরোধ.ক্রিটআরস্পোনসের সাথে এএসপি.নেট ওয়েবএপিআই ইউনিট পরীক্ষা করা


147

আমি আমার অ্যাপিকন্ট্রোলারের জন্য কিছু ইউনিট পরীক্ষা লেখার চেষ্টা করছি এবং কিছু সমস্যার মুখোমুখি হয়েছি। রিকোয়েস্ট নামে একটি দুর্দান্ত এক্সটেনশন পদ্ধতি রয়েছে re

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

আংশিক উপহাস ব্যবহার না করে বা "নতুন এইচটিপিআরস্পোনমেসেজ (...)" সরাসরি ব্যবহার না করে কি ক্রিয়েটরেসপন্সকে উপহাস করার কোনও উপায় আছে?


1
আপনি কেন উপহাস করতে চান CreateResponse? প্রত্যাবর্তিত HttpResponseMessage Contentএবং StatusCodeসঠিক মানগুলি সেট করা আছে এমন বৈশিষ্ট্যগুলিতে কেন চাপ দেওয়া হয়নি ?
nemesv

3
যদি আমি এই পদ্ধতিটি ইউনিট পরীক্ষার ফর্মটি পরিচালনা করি তবে এটি ব্যতিক্রম ব্যর্থ হবে যে কনফিগারেশন সেট করা নেই।
আশা

1
ঠিক আছে, আমাকে লজ্জা, আমি শুধু লেখার this.Request.CreateResponse করা প্রয়োজন (HttpStatusCode.Accepted, createdProduct, GlobalConfiguration.Configuration)
আশা

উত্তর:


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অনুরোধে আপনার একটি সেটও থাকতে হবে অন্যথায় রাউটিং এবং পাইপলাইনের অন্যান্য অংশগুলি সঠিকভাবে কাজ করবে না।


হ্যাঁ, এটি পাশাপাশি কাজ করতে পারে তবে এটি অনুরোধ বলে মনে হয় re ক্রিটআরস্পোনসও কাজ করে।
আশা

4
গ্লোবাল কনফিগারেশন যুক্ত করা হচ্ছে on কনফিগারেশন এখনও অনুরোধ বামে। অনুরোধটি সেট করা আমার পক্ষে কাজ করেছিল, তবে এটি আমার সমস্যার শেষ ছিল না কারণ আমার অ্যাকশনটিও ইউরলকে ডেকেছিল ink লিঙ্ক এবং রুটের নামটি সংজ্ঞায়িত করা হয়নি।
বোকাশাট

রুট স্থাপনের জন্য সহায়তা stackoverflow.com/questions/11779311/...
foolshat

এই কলের পরে কন্ট্রোলার কনটেক্সট সেট করা আমাকে ত্রুটিটি দেয় তবে কেবল ওয়েবএপি 5.0.0 দিয়ে। তবে আমি যদি অনুরোধটি শেষের দিকে এইচটিটিপি কনফিগারেশন অবজেক্টটি সেট করি তবে এটি ঠিক আছে।
মাইক্রব্রিজ

এটি নিখুঁতভাবে কাজ করে, তবে কেন এটি কাজ করে তা আমি বুঝতে ব্যর্থ। আপনি কি উত্তরে এই বিস্তারিত বলতে পারেন?
জানু_ভি

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;

ইউনিট টেস্টিং এএসপি.নেট ওয়েব এপিআই- তে পিটার প্রোভস্টের বিস্তৃত ব্লগ পোস্ট থেকে অনুলিপি করা হয়েছে ।


1
আপনি এই সম্পর্কিত এমএস ডক্সগুলিতেও আগ্রহী হতে পারেন: ডকস.মাইক্রোসফট.ইন / ইউএস / এস্পনেট / ওয়েবে- এপি / ওভারভিউ / আপনিও 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);
}

কন্ট্রোলারে অনুরোধ এবং কনফিগারেশন সেট করা গুরুত্বপূর্ণ। অন্যথায়, পরীক্ষাটি একটি আর্গুমেন্টনালএক্সসেপশন বা অবৈধ অপারেশন এক্সসেপশন দিয়ে ব্যর্থ হবে।

আরও তথ্যের জন্য এখানে দেখুন ।


1

ওয়েবপিআই 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());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.