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 回答