Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Load JSON string to HttpRequestMessage

Tags:

I'm writing some tests for my WebAPI web service and cannot figure out how to send JSON to my service method in the test.

ScheduleRequest sr = new ScheduleRequest(); sr.Months = null; sr.States = null; sr.Zip = null; sr.Miles = null; sr.PCodes = null; sr.PageStart = 1; sr.PageLimit = 10;  HttpRequestMessage m = new HttpRequestMessage(); string sr_ = JsonConvert.SerializeObject(sr);  // How do I load it into the HttpRequestMessage??? // m.Content. = sr_; var controller = new ShoppingCartController();  // Call the controlelr method and test if the return data is correct. EventSyncResponse res = (EventSyncResponse)controller.CourseSchedule(m); 

Am I doing this correctly, too?

Controller Code:

public object CourseSchedule(ScheduleRequest request) {     try     {         var result = cart.GetCourseSchedule(request);         return Ok(result);     }      catch (Exception ex)     {         if (ex.Message.StartsWith(@"ORA-20001"))         {             return Ok(new ParticipantResponse { FirstName = "No record found" });         }         throw ex;     } } 
like image 739
MB34 Avatar asked Aug 18 '16 13:08

MB34


1 Answers

[TestClass] public class ShoppingCartControllerTests {     [TestMethod]     public void TestCourseSchedule() {         //Arrange         var sr = new ScheduleRequest();         sr.Months = null;         sr.States = null;         sr.Zip = null;         sr.Miles = null;         sr.PCodes = null;         sr.PageStart = 1;         sr.PageLimit = 10;          var json = JsonConvert.SerializeObject(sr);         //construct content to send         var content = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json");         var request = new HttpRequestMessage {             RequestUri = new Uri("http://localhost/api/shoppingcart"),             Content = content         };          var controller = new ShoppingCartController();         //Set a fake request. If your controller creates responses you will need this         controller.Request = request;         //Act         // Call the controller method and test if the return data is correct.         var response = controller.CourseSchedule(request) as OkNegotiatedContentResult<List<EventSyn‌​cResponse>> ;          //Assert         //...other asserts     } } 

But I get the impression that your Action should actually be refactored like this in your controller

public class ShoppingCartController : ApiController {      public IHttpActionResult CourseSchedule(ScheduleRequest model) { ... }  } 

which would mean that your isolated unit test should be refactored to...

[TestClass] public class ShoppingCartControllerTests {     [TestMethod]     public void TestCourseSchedule() {         //Arrange         var sr = new ScheduleRequest();         sr.Months = null;         sr.States = null;         sr.Zip = null;         sr.Miles = null;         sr.PCodes = null;         sr.PageStart = 1;         sr.PageLimit = 10;         var controller = new ShoppingCartController();         //Set a fake request. If your controller creates responses you will need this         controller.Request = new HttpRequestMessage {             RequestUri = new Uri("http://localhost/api/shoppingcart"),         };         //Act         // Call the controller method and test if the return data is correct.         var response = controller.CourseSchedule(sr) as OkNegotiatedContentResult<List<EventSyn‌​cResponse>> ;;          //Assert         //...     } } 
like image 115
Nkosi Avatar answered Oct 12 '22 07:10

Nkosi