2016-08-18 24 views
5

WebAPI web hizmetim için bazı testler yapıyorum ve testte hizmet yöntemime JSON'un nasıl gönderileceğini anlayamıyorum.JSON dizesini HttpRequestMessage için yükle

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

Bunu doğru mu yapıyorum?

Kontrolör Kodu:

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

Diğer yöntemlerin çoğu GET aracılığıyla test edilebilir ve parametre olarak JSON verisine gerek yoktur. – MB34

cevap

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

Ama senin Eylem aslında denetleyicisi böyle refactored edilmelidir izlenimini edinmek, izole birim test için refactored gerektiği anlamına gelir

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