Load JSON string to HttpRequestMessage

40,000
[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
        //...
    }
}
Share:
40,000

Related videos on Youtube

MB34
Author by

MB34

Updated on May 24, 2020

Comments

  • MB34
    MB34 almost 4 years

    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;
        }
    }
    
    • MB34
      MB34 over 7 years
      Most of the other methods can be tested via GET and don't need JSON data as parameters.