2014-01-14 28 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),所以你可能會遇到像你一樣的麻煩。