如何从MVC4.5中的base.SendAsync()模拟(rhino.mocks)响应对象Web API处理程序SendAsync()方法

时间:2013-04-01 11:17:24

标签: c# unit-testing asp.net-web-api rhino-mocks

我必须使用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处理程序中进行自定义响应? 非常感谢!!

1 个答案:

答案 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;
  }
}