MB34 MB34 - 3 months ago 15
C# Question

Load JSON string to HttpRequestMessage

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;
}
}

Answer
[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 EventSyncResponse 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
        //...
    }
}
Comments