【问题标题】:HttpContext Null through Unit testingHttpContext Null 通过单元测试
【发布时间】:2016-06-20 11:06:18
【问题描述】:

我有以下代码来评估 IP 地址

 public string getIPAddress()
        {
            string IPAddress = string.Empty;
            String strHostName = HttpContext.Current.Request.UserHostAddress.ToString();
            IPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString();
            return IPAddress;


        }

现在当我尝试对此方法进行单元测试时,它总是抛出错误,空引用,

我不能仅仅为了单元测试而改变实际的方法,有什么方法可以处理这个...

谢谢

【问题讨论】:

  • 你可以看看这个question,它展示了如何模拟一个httpContext。我认为在您的情况下这将是一个很好的解决方案!

标签: c# asp.net unit-testing httpcontext


【解决方案1】:

这是意料之中的,因为 HttpContext 在单元测试中不可用,并且单元测试在它们自己的上下文中运行。您将需要有一种方法来模拟/为您的单元测试提供 HttpContext。

【讨论】:

  • 如果我没有丢失,那么它需要在实际方法中进行更改,这是我不想要的
【解决方案2】:

如果您不直接使用“HttpContext.Current.Request.UserHostAddress” - 而是通过包装类或其他可模拟类代替,您可以模拟该行为。

Here is an Example

你也应该模拟System.Net.Dns.GetHostAddresses(strHostName).GetValue(0),让你的测试也独立于这个类。

【讨论】:

    【解决方案3】:

    如果您想在单元测试时模拟 HTTPContext,您可以使用typemock,如下例中关于您的方法:

    [TestMethod,Isolated]
    public void TestForHttpContext_willReturn123AsIP()
    {
        // Arrange
        Program classUnderTest = new Program();
        IPAddress[] a = { new IPAddress(long.Parse("123")), new IPAddress(long.Parse("456")), new IPAddress(long.Parse("789")) };
    
        Isolate.WhenCalled(() => HttpContext.Current.Request.UserHostAddress).WillReturn("testIP");
        Isolate.WhenCalled(() => Dns.GetHostAddresses(" ")).WillReturn(a);
    
        // Act
        var res = classUnderTest.getIPAddress();
    
        // Assert
        Assert.AreEqual("123.0.0.0", res);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      相关资源
      最近更新 更多