【发布时间】:2014-02-03 05:13:57
【问题描述】:
我想对以下操作进行集成测试。
如何在集成测试中传递我的 requestDto 对象?
GetAsync 和 SendAsync 方法都没有用于将自定义对象传递给服务器的重载参数。
[Route("{startDate:datetime}")]
[HttpGet]
public HttpResponseMessage Get(DateTime startDate, [FromBody]LessonplannerGetRequest request)
{
request.StartDate = startDate;
var lessonplannerResponse = _service.GetPeriodsByWeekStartDate(request);
return Request.CreateResponse<LessonplannerResponse>(HttpStatusCode.OK, lessonplannerResponse);
}
[Test]
public void Get_Lessons_By_Date()
{
// Arrange
var request = new HttpRequestMessage(HttpMethod.Get, _server.BaseAddress + "/api/lessonplanner/2014-01-14");
var myRequestDto = new LessonplannerGetRequest();
// Act => QUESTION: HOW do I pass the myRequestDto ???
var response = _client.SendAsync(request, new CancellationToken()).Result;
// Assert
Assert.That(response.StatusCode == HttpStatusCode.OK);
}
更新
正如 Darrel Miller 所说:“从技术上讲,HTTP 说你可以发送一个正文,它只是说这个正文没有任何意义并且不能被使用。HttpClient 不会让你发送一个。”
我在这里发布了我与 HttpClient 的集成测试,该测试使用复杂类型 + FromBody 执行 Get 请求:
// Arrange
var request = new HttpRequestMessage(HttpMethod.Get, _server.BaseAddress + "/api/lessonplanner/2014-01-14");
var myRequestDto = new LessonplannerGetRequest{ FirstDayOfWeek = DayOfWeek.Sunday, SchoolyearId = 1, StartDate = DateTime.Today};
request.Content = new ObjectContent<LessonplannerGetRequest>(myRequestDto, new JsonMediaTypeFormatter());
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Act
var response = _client.SendAsync(request, new CancellationToken()).Result;
// Assert
Assert.That(response.StatusCode == HttpStatusCode.OK);
当然,这不是 Http 方式,有些人可能会考虑通过 FromUri/查询字符串发送复杂类型。
【问题讨论】:
-
如果你发出一个http请求,你应该序列化你的requestDto对象并通过request.body发送。
-
HTTP 语义不允许 GET 的正文。更类似于 HTTP 的方法是在 URI 和查询字符串中传递请求数据,并使用
[FromUri]绑定到复杂类型。只是一个想法。 -
@Badri 从技术上讲,HTTP 说您可以发送正文,它只是说正文没有任何意义并且不能使用。 HttpClient 不会让你发送一个。
-
@DarrelMiller 你说的不是真的我刚刚在我的集成测试中使用了 HttpClient 与 GET + 复杂类型 + FromBody 并且效果很好。
-
@Elisa 我收到错误消息“无法使用此动词类型发送内容主体。”
标签: asp.net-web-api integration-testing asp.net-web-api2