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; } }
[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<EventSyncResponse>> ; //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<EventSyncResponse>> ;; //Assert //... } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With