2013-04-01 20 views
0

我必须在ASP.NET MVC Web API控制器上使用Rhino.Mock编写单元测试 有一个名为AHandler.cs的处理程序,其中包含来自System.Net.Http.HttpClientHandler类的入侵。 AHandler.cs的singnature SendAsync方法是像如下:上述如何从MVC4.5 Web API处理程序中的base.SendAsync()模拟(rhino.mocks)响应对象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”,并得到我想要的手工响应结果。 但似乎犀牛制品不能看到“基地”关键字时,我写了如下代码:

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

为什么你想嘲笑一个处理程序在第一位?您可以为您的测试注入一个特定的虚拟实现。该处理程序将返回测试期望的新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; 
    } 
} 
相关问题