簡體   English   中英

使用 NSubstitute 進行 MVC 單元測試中的 Mocking 用戶 IP 地址

[英]Mocking user IP address in MVC unit test with NSubstitute

我的 HomeController 中有以下方法。 目的是根據IP地址拆分用戶,測試不同版本的首頁:

        [HttpGet]
        public ActionResult Index()
        {
            var userIpAddress = GetUserIpAddress();

            if (IsIpAddressOddOrEven(userIpAddress))
            {
                return RedirectToAction(HomePage);
            }

            return RedirectToAction(HomePageAlternative);
        }

GetUserIpAddress方法:

private string GetUserIpAddress()
        {
            HttpContext context = System.Web.HttpContext.Current;
            var ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }
            return context.Request.ServerVariables["REMOTE_ADDR"];
        }

我想編寫一個單元測試以確保它正常工作。 但是,每次單元測試運行時,它只是使用我目前擁有的 IP 地址。 我正在努力研究如何模擬“GetUserIpAddress”方法的結果以返回奇數或偶數字符串。 到目前為止我的嘗試:

        [Test]
        public void Test()
        {
            var controller = CreateMvcController<HomeController>();

            var result = controller.Index();
            controller.HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Returns("1");
            Assert.IsInstanceOf<RedirectToRouteResult>(result);

            var redirectToRouteResult = result as RedirectToRouteResult;

            Assert.AreEqual(HomeController.HomePage, redirectToRouteResult.RouteValues["action"]);
        }

我得到的錯誤是controller.HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Returns("1"); 不是一個字符串,而是一個 HttpResponseBase,無論如何我都不相信我會以正確的方式去做。 請有人能指出我正確的方向嗎? 謝謝

我建議您將GetUserIpAddress方法移至可以注入HomeController的助手 class 。 因此,您可以在進行單元測試時對其進行模擬。

您的HomeController將是這樣的

public HomeController(IUserIpAddressHelper userIpAddressHelper)
{
    _userIpAddressHelper = userIpAddressHelper;
}

[HttpGet]
public ActionResult Index()
{
    var userIpAddress = _userIpAddressHelper.GetUserIpAddress(System.Web.HttpContext.Current);
    if (_userIpAddressHelper.IsIpAddressOddOrEven(userIpAddress))
    {
        return RedirectToAction(HomePage);
    }
    
    return RedirectToAction(HomePageAlternative);
}

因此,您將能夠模擬UserIpAddressHelper並在編寫測試時注入它。

public void Test()
{
    var userIpAddressHelper = Substitute.For<IUserIpAddressHelper>();
    userIpAddressHelper.GetUserIpAddress(Arg.Any<HttpContext>()).Returns("0.0.0.0");
  
    var controller = new HomeController(userIpAddressHelper);

    var result = controller.Index();

    Assert.IsInstanceOf<RedirectToRouteResult>(result);

    var redirectToRouteResult = result as RedirectToRouteResult;
    Assert.AreEqual(HomeController.HomePage, redirectToRouteResult.RouteValues["action"]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM