2013-04-01 17 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; 
    } 
} 
相關問題