2017-10-27 15 views
0

web apiコントローラ用のHttpContextをモックしようとしていて、moqを使用していて、グーグルでウェブAPIコントローラに関する関連記事を取得できませんでした。MOQを使用したWeb APIのモックHttpContext

var context = new Mock<HttpContextBase>(); 
      var request = new Mock<HttpRequestBase>(); 
      var response = new Mock<HttpResponseBase>(); 
      var session = new Mock<HttpSessionStateBase>(); 
      var server = new Mock<HttpServerUtilityBase>(); 

      context.Setup(c => c.Request).Returns(request.Object); 
      context.Setup(c => c.Response).Returns(response.Object); 
      context.Setup(c => c.Session).Returns(session.Object); 
      context.Setup(c => c.Server).Returns(server.Object); 


      return context.Object; 

その方法は、MVCのために動作しますが、ウェブAPIの我々はMVCではなく、ウェブAPIにControllerContextにHttpContextBaseを渡すことができないので。

+0

不完全なので、現在の状態の質問は不明です。 [ask]を読んで、あなたの問題をよりよく理解するために使用できる[mcve]を提供してください。 – Nkosi

+0

また、あなたのコードを 'HttpContext'に強く結びつけるのを止めてください。これは、テスト困難な実装の問題です。コードを適切に構造化することで、この問題を回避できます。サードパーティの依存関係のように 'HttpContext'を扱います。 – Nkosi

+0

つまり、外部依存関係として渡されることなく、Webアプリケーションのhttpcontextをモックする方法はありませんか? –

答えて

0

これについて私たちはどのように感じますか?私は以下のユニットを書くための素晴らしい方法です見つける、

public interface IHttpContext 
{ 
    string Url { get; } 
} 

public class HttpContextProvider : IHttpContext 
{ 
    public string Url => HttpContext.Current.Request.Url.ToString(); 
} 

public class MockedHttpContextProvider : IHttpContext 
{ 
    public string Url => "https://google.com"; 
} 

は、私はあなたが深いアプリケーションにのHttpContextを渡すべきではありません同意するが、あなたは古いコードをリファクタリングしている場合、それはすでにツリーダウン長い道のりを渡されていますあなたの新しいコードをテストし、他の人のものに触れる必要はありません!

関連する問題