如何在请求标题中注入一些东西进行测试?

时间:2011-07-21 05:31:39

标签: asp.net-mvc-3

我目前正在为网站实施SiteMinder,它会在请求标头中查找名为SM_USER的密钥。我使用下面的函数检索它:

 public string ReadUser()
 {
    return HttpContext.Current.Request.Headers["SM_USER"];
 }

我希望测试与此功能相关的功能是否有效;我已经尝试使用模拟类进行单元测试,所以我希望在请求标头中创建密钥SM_USER。我怎么能这样做?

我正在使用MVC3实现该应用程序。

1 个答案:

答案 0 :(得分:1)

只要您使用HttpContext.Current,就无法测试它,因为Unit Test不会有HttpContext.Current。

尝试使用带有返回字符串的方法的接口,比如ReadUser()。在应用程序的类中实现此接口。使用接口变量中使用此方法的任何类。在该类中,默认构造函数将该接口变量值设置为“new”实现者类。添加构造函数的重载,它将获取interface类型的参数并将该参数设置为接口变量。

现在,在您的UnitTest项目中,在另一个类中实现相同的接口。在此实现中,您现在可以传递您想要测试的任何模拟值。

public interface IReadUserInfo
{  string ReadUser();     }

public class ReadUserInfo: IReadUserInfo
{
    public string ReadUser()
    {
       return HttpContext.Current.Request.Headers["SM_USER"];
    }
}


public class UserClass
{
    IReadUserInfo userinfo;

    public UserClass()
    {
        userinfo = new ReadUserInfo();
    }

    public USerClass(IReadUserInfo newuserinfo)
    {
        userinfo = newuserinfo;
    }
}

public class TestReadUserInfo : IReadUSerInfo
{
     public string ReadUser()
     { return "testvalue";  }
}

如果ReadUser是您从Request标头使用的唯一值,那么这种方法将解决问题。但是,如果您使用Request对象中的更多值,则可能需要以类似的方式模拟整个请求对象。