HttpContext Null通过单元测试

时间:2016-06-20 11:06:19

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

我有以下代码来评估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;


        }

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

我无法改变单元测试的实际方法,有没有办法处理这个......

由于

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您不使用" HttpContext.Current.Request.UserHostAddress"直接 - 但是通过包装类或其他可模拟的类,你可以模拟行为。

Here is an Example

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

答案 2 :(得分:0)

如果你想在单元测试时模拟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);
}