2

我想对以下操作进行集成测试。

如何在集成测试中传递我的 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 说你可以发送一个 body,它只是说这个 body 没有任何意义并且不能被使用。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/query 字符串以不同的方式发送复杂类型。

4

2 回答 2

6

HTML 规范说您不能发送带有正文的 GET。

HTTP 规范允许它。

WebAPI 允许它,因为它是一个服务/REST 并且实现了 HTTP 但不是 HTML,但是许多客户端和浏览器不允许它,因为它们实现了这两个规范并试图变得严格。

至于规范(RFC1866,第 46 页;HTML 4.x第 17.13.3 节)本身,它指出:

如果方法是“get”并且操作是一个 HTTP URI,用户代理会获取 action 的值,附加一个 `?' 到它,然后附加表单数据集,使用“application/x-www-form-urlencoded”内容类型编码。

(例如,如果您<form>使用 GET 进行操作,它将解析所有表单参数并将它们设置在查询字符串中?a=b)。

就纯 HTTP 和 REST 服务的上下文而言,没有什么可以阻止这种行为,但并非所有客户端都能够处理它。当涉及到 REST/WebAPI 时,最好的实践建议是不处理来自 HttpGet 的正文数据,只处理 URI 数据(相反,元数据/动作限定符通常可以容忍 POST /action?filter=all,但这是另一个讨论) .

所以,是的,即使只在内部使用,风险自负。由于并非所有客户端都处理它(例如 HttpRequestMessage),因此您可能会遇到麻烦。

于 2014-01-17T13:27:36.787 回答
0

您不应该使用 HTTPClient 传递 GET 正文。

于 2014-01-14T23:57:40.007 回答