我必须使用Rhino.Mock在ASP.NET MVC Web API Controller上编写单元测试 我有一个名为AHandler.cs的处理程序,带有来自System.Net.Http.HttpClientHandler类的inherts。 AHandler.cs的单一SendAsync方法如下:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
.....
var response = base.SendAsync(request, cancellationToken).Result;
if (response.IsSuccessStatusCode)
{
.....
}
}
上面的base关键字表示HttpClientHandler,其SendAsync()方法是“受保护的”!!! 现在我尝试模拟对象“base.SendAsync(request,cancellationToken).Result”并获得我想要的手工响应结果。 但是当我编写以下代码时,似乎Rhino mocks看不到“base”关键字:
var mockbase = MockRepository.GenerateMock<AHandler>;
mockbase.Stub(x => x.base <=== can't see base keyword
^^^^^
所以我改变另一种方式并尝试模拟HttpClientHandler类
var mockbase = MockRepository.GenerateMockHttpClientHandler>;
mockbase.Stub(x => x. <== I can't see SendAsync() method, becase it is protected !!
现在我真的很痛苦! 任何人都可以给我一些建议,告诉我如何在MVC处理程序中进行自定义响应? 非常感谢!!
答案 0 :(得分:0)
为什么要首先模拟处理程序?您可以为测试注入特定的虚拟实现。该处理程序将返回测试所需的新HttpResponse消息。
public class MyDummyHttpHandler : DelegatingHandler
{
HttpResponseMessage response;
public MyDummyHttpHandler(HttpResponseMessage response)
{
this.response = response;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
.....
TaskCompletionSource<HttpResponseMessage> tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(this.response);
return tsc.Task;
}
}