Asp.net-Mvc

如何使用 ASP.NET MVC 的 MOQ 模擬 Request.ServerVariables?

  • October 27, 2016

當我開始了解模擬和不同的框架時,我只是在學習為我的 asp.net mvc 進行單元測試。

在檢查 SO 之後,我發現 MOQ 似乎是最容易接受的。到目前為止,我一直在嘗試模擬 Request.ServerVariables,因為在閱讀了這篇文章之後,我了解到最好將它們抽象為屬性。

像這樣:

/// <summary>
       /// Return the server port
       /// </summary>
       protected string ServerPort
       {
           get
           {
               return Request.ServerVariables.Get("SERVER_PORT");
           }
       }

但是我很難學習如何正確地模擬它。我有一個家庭控制器 ActionResult 函式,它獲取使用者伺服器資訊並繼續創建一個表單來獲取使用者資訊。

我嘗試使用hanselman 的 mvcmockhelpers 類,但我不知道如何使用它。

這是我到目前為止…

[Test]
       public void Create_Redirects_To_ProductAdded_On_Success() 
       {

           FakeViewEngine engine = new FakeViewEngine();

           HomeController controller = new HomeController();
           controller.ViewEngine = engine;

           MvcMockHelpers.SetFakeControllerContext(controller);

           controller.Create();

           var results = controller.Create();

           var typedResults = results as RedirectToRouteResult;

           Assert.AreEqual("", typedResults.RouteValues["action"], "Wrong action");
           Assert.AreEqual("", typedResults.RouteValues["controller"], "Wrong controller");
       }

問題:

  1. 截至目前,當我執行測試時,我仍然收到空異常錯誤。那麼我在這裡缺少什麼?
  2. 如果我使用 mvcmockhelpers 類,我怎麼還能呼叫 request.verifyall 函式來確保所有模擬都正確設置?

所以基本上我已經輸入了所有的參考資料,並且使用這個函式我能夠讓它工作。我還沒有使用 mvcmockhelpers 類,因為我仍在努力學習所有這些。

對於有興趣了解我如何解決此問題的任何人,這是我使用的程式碼。

[Test]
public void Create_Returns_ViewResult_On_Success() 
{
 var server = new Mock<HttpServerUtilityBase>(MockBehavior.Loose);
 var response = new Mock<HttpResponseBase>(MockBehavior.Strict);

 var request = new Mock<HttpRequestBase>(MockBehavior.Strict);
 request.Setup(x => x.ApplicationPath).Returns("/");
 request.Setup(x => x.Url).Returns(new Uri("http://localhost"));
 request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection{
   { "SERVER_NAME", "localhost" },
   { "SCRIPT_NAME", "localhost" },
   { "SERVER_PORT", "80" },
   { "HTTPS", "www.melaos.com" },
   { "REMOTE_ADDR", "127.0.0.1" },
   { "REMOTE_HOST", "127.0.0.1" }
 });

 var context = new Mock<HttpContextBase>();
 context.SetupGet(x => x.Request).Returns(request.Object);
 context.SetupGet(x => x.Response).Returns(response.Object);
 context.SetupGet(x => x.Server).Returns(server.Object);

 var controller = new HomeController();
 //MvcMockHelpers.SetFakeControllerContext(controller);
 controller.ControllerContext = new ControllerContext(context. Object, new RouteData(), controller);

 var results = controller.Create();
 Assert.IsNotNull(results);
 Assert.IsInstanceOf(typeof(ViewResult), results);
}

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