Asp.net

單元測試 Web 服務 - HttpContext

  • December 11, 2013

我想為 Web 服務編寫單元測試。我創建了我的測試項目,引用了我的 Web 項目(不是服務引用、程序集引用),然後編寫了一些程式碼來測試 Web 服務——它們工作正常。但是,有一些服務可以確保使用者使用HttpContext.Current.User.Identity.IsAuthenticated.

在測試的上下文中,沒有 HttpContext 這樣的東西,所以測試總是失敗。應該如何對這些類型的 Web 服務進行單元測試?

是一個相關的討論。

我停止HttpContext.Current直接引用。並改用這個類:

public class HttpContextFactory
{
   private static HttpContextBase m_context;
   public static HttpContextBase Current
   {
       get
       {
           if (m_context != null)
               return m_context;

           if (HttpContext.Current == null)
               throw new InvalidOperationException("HttpContext not available");

           return new HttpContextWrapper(HttpContext.Current);
       }
   }

   public static void SetCurrentContext(HttpContextBase context)
   {
       m_context = context;
   }
}

並在我們的程式碼中使用 HttpContextFactory.Current而不是 。HttpContext.Current

然後你在你的測試中寫下這個:

       HttpContextFactory.SetCurrentContext(GetMockedHttpContext());

GetMockedHttpContext() 來自這裡,看起來像這樣:

   private System.Web.HttpContextBase GetMockedHttpContext()
   {
       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>();
       var user = new Mock<IPrincipal>();     
       var identity = new Mock<IIdentity>();

       context.Setup(ctx => ctx.Request).Returns(request.Object);
       context.Setup(ctx => ctx.Response).Returns(response.Object);
       context.Setup(ctx => ctx.Session).Returns(session.Object);
       context.Setup(ctx => ctx.Server).Returns(server.Object);
       context.Setup(ctx => ctx.User).Returns(user.Object);
       user.Setup(x => x.Identity).Returns(identity.Object);
       identity.Setup(id => id.IsAuthenticated).Returns(true);
       identity.Setup(id => id.Name).Returns("test");

       return context.Object;
   }

它使用一個 名為moq的模擬框架

在您的測試項目中,您必須添加對System.Weband的引用System.Web.Abstractions,其中HttpContextBase定義了。

引用自:https://stackoverflow.com/questions/4028056