1

この拡張メソッドでHttpContextをモックアウトするにはどうすればよいですか?

public static class MyHtmlHelper
{
    public static string GetFullPath(this HtmlHelper helper)
    {
        var url = HttpContext.Current.Request.Url;

        return url.Scheme + "://" + url.AbsolutePath;
    }
}
4

1 に答える 1

2

HttpContextFactoryを作成し、それを使用して、テスト内に設定します。

public static class HttpContextFactory
    {
        [ThreadStatic]
        private static HttpContextBase _mockHttpContext;

        public static void SetHttpContext(HttpContextBase httpContextBase)
        {
            _mockHttpContext = httpContextBase;
        }

        public static HttpContextBase GetHttpContext()
        {
            if (_mockHttpContext != null)
            {
                return _mockHttpContext;
            }

            if (HttpContext.Current != null)
            {
                return new HttpContextWrapper(HttpContext.Current);
            }
            return null;
        }
    }

次に、これに対するコードで:

var url = HttpContextFactory.GetHttpContext().Request.Url;

次に、テストでプロパティを継ぎ目として使用します

HttpContextFactory.SetHttpContext(HttpMocks.HttpContext());

ここで、HttpMocksには次のものがあり、テストに合わせて調整されます。

public static HttpContextBase HttpContext()
      {
          var context = MockRepository.GenerateMock<HttpContextBase>();
          context.Stub(r => r.Request).Return(HttpRequest());
          // and stub out whatever else you need to, like session etc
          return context;
      }


      public static HttpRequestBase HttpRequest()
      {
          var httpRequest = MockRepository.GenerateMock<HttpRequestBase>();
          httpRequest.Stub(r => r.Url).Return("/"); //or some test setting
          return httpRequest;
      }
于 2012-11-19T12:56:42.070 に答える