Trong phương pháp này, tôi tạo ra một TestHandler và thiết lập nó như là tài sản của InnerHandler
xử lý được kiểm tra. Trình xử lý được kiểm tra sau đó có thể được chuyển đến một số HttpClient
- điều này có vẻ không trực quan nếu bạn đang viết một trình xử lý phía máy chủ, nhưng đây thực sự là một cách nhẹ để kiểm tra trình xử lý - nó sẽ được gọi giống như cách nó sẽ làm trong một máy chủ.
TestHandler sẽ chỉ trả lại HTTP 200 theo mặc định, nhưng hàm tạo của nó chấp nhận một hàm bạn có thể sử dụng để thực hiện xác nhận về thông báo yêu cầu đã qua từ trình xử lý đang được kiểm tra. Cuối cùng, bạn có thể xác nhận kết quả của cuộc gọi SendAsync từ máy khách.
Sau khi mọi thứ được thiết lập, hãy gọi SendAsync
trên phiên bản ứng dụng khách để gọi trình xử lý của bạn. Yêu cầu sẽ được chuyển vào trình xử lý của bạn, nó sẽ chuyển nó cho TestHandler (giả sử nó truyền cuộc gọi), sau đó nó sẽ trả về một câu trả lời cho trình xử lý của bạn.
handler
Xét nghiệm này trông như thế này:
public class TestHandler : DelegatingHandler
{
private readonly Func<HttpRequestMessage,
CancellationToken, Task<HttpResponseMessage>> _handlerFunc;
public TestHandler()
{
_handlerFunc = (r, c) => Return200();
}
public TestHandler(Func<HttpRequestMessage,
CancellationToken, Task<HttpResponseMessage>> handlerFunc)
{
_handlerFunc = handlerFunc;
}
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
return _handlerFunc(request, cancellationToken);
}
public static Task<HttpResponseMessage> Return200()
{
return Task.Factory.StartNew(
() => new HttpResponseMessage(HttpStatusCode.OK));
}
}
Ví dụ sử dụng với một tưởng tượng MyHandler
dưới kiểm tra. Sử dụng NUnit cho các xác nhận .:
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://test.com");
httpRequestMessage.Headers.Add("username", "test");
var handler = new MyHandler()
{
InnerHandler = new TestHandler((r,c) =>
{
Assert.That(r.Headers.Contains("username"));
return TestHandler.Return200();
})
};
var client = new HttpClient(handler);
var result = client.SendAsync(httpRequestMessage).Result;
Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK));
Hành vi mặc định của TestHandler có thể tốt cho nhiều thử nghiệm và làm cho mã đơn giản hơn. Quá trình cài đặt các trình điều khiển được kiểm tra sau đó trông như thế này:
var handler = new MyHandler();
handler.InnerHandler = new TestHandler();
Tôi thích phương pháp này vì nó giữ tất cả các khẳng định trong phương pháp kiểm tra, và TestHandler
rất tái sử dụng.
cách bạn xử lý đối tượng yêu cầu tại đây. request.createresponse thất bại vì không có httpconfiguration.vì vậy nếu bạn thêm một cái bạn có thể nhận được, nhưng nếu bạn quan tâm đến các thuộc tính yêu cầu khác được liên kết với httprequestmessage bạn đã tạo ra thì sao? – Steve
Mục tiêu của tôi ở đây là hoàn toàn kiểm tra trình xử lý; vì vậy không phải là gợi ý của bạn về việc thêm HttpConfiguration đủ? Kịch bản của bạn là gì? –
Tôi đã phải thêm trình bao bọc xung quanh request.content, request.properties và request.getroutedata. tất cả là tốt trong thử nghiệm landia – Steve