2016-08-18 131 views
5

我正在爲我的WebAPI Web服務編寫一些測試,但無法弄清楚如何在測試中將JSON發送到我的服務方法。將JSON字符串加載到HttpRequestMessage

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

我是否也正確地做到了這一點?

控制器代碼:

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

大多數其他方法都可以通過GET進行測試,並且不需要JSON數據作爲參數。 – MB34

回答

9
[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 
    } 
} 

,但我得到的是你的行動實際上應該在你的控制器進行重構,這樣的印象

public class ShoppingCartController : ApiController { 

    public EventSyncResponse CourseSchedule(ScheduleRequest model) { ... } 

} 

這將意味着你的隔離單元測試需要重構到...

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