2014-01-14 79 views
2

我想对以下操作执行集成测试。使用web api在请求正文中获取复杂类型参数的请求

我如何可以通过在集成测试我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); 
} 

UPDATE

正如达雷尔·米勒说:“从技术上说,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的方式有些人可能认为这样做differentlly通过FromUri发送复杂类型/请求参数。

+0

如果您正在发出http请求,您应该序列化您的requestDto对象并通过request.body发送它。 – xoail

+0

HTTP语义不允许GET的主体。这样做的HTTP-ish方法越多,就是在URI和查询字符串中传入请求数据,并使用'[FromUri]'绑定到复杂类型。只是一个想法。 – Badri

+0

@Badri技术上HTTP说你可以发送一个body,它只是说body没有任何意义而且不能使用。 HttpClient不会让你发送一个。 –

回答

1

您不应该通过GETClient与HTTPClient。

+0

grrr ...我已经这样做过了......感谢Darrel – Elisabeth

+0

@Elisa对不起,我误解了你的问题。你想用GET发送一个正文。你不能那样做。 HTTP表示GET消息中的实体没有意义。 –

+0

我刚刚通过请求body + Http Get发送了我的复杂类型,它工作正常。为什么Web API在Http规范禁止时允许它? – Elisabeth

6

HTML规范说,你不能发送GET与身体。

HTTP规范允许它。

的WebAPI允许它,因为它是一个服务/ REST和实现HTTP而不是HTML,但许多客户和浏览器将不允许它,因为他们实现这两个规格,尽量严格。

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

如果该方法是“获取”和动作是HTTP URI,用户代理需要行动的价值,附加一个'?'然后附加表单数据集,使用“application/x-www-form-urlencoded”内容类型进行编码。

(例如,如果你做一个<form>用GET,它会分析所有形式PARAMS和设置他们在查询字符串?A = B)。

在纯HTTP的术语,并采用的REST服务的情况下,没有什么能够阻止这种行为,但并非所有的客户将能够处理它。当REST/WebAPI不处理来自HttpGet的主体数据,只有URI数据(相反,POST/action?filter = all通常可以容忍元数据/动作限定符,但这是另一个讨论)时,这通常是最佳实践建议。 。

所以,是的,这是你自己的风险,即使仅在内部使用。因为并非所有的客户端都处理它(例如HttpRequestMessage),所以你可能会遇到像你一样的麻烦。