我如何模拟Request.Url.GetLeftPart()以便我的单元测试通过

时间:2011-03-09 16:58:37

标签: c# asp.net unit-testing

我的代码执行此操作

string domainUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
int result = string.Compare(domainUrl, "http://www.facebookmustdie.com");
// do something with the result...

我如何模拟这个以便我的单元测试通过,我是否必须模拟整个HttpContext类?如果是这样的话,我将如何将其注入代码中,以便在运行单元测试时使用“正确的”HttpContext

5 个答案:

答案 0 :(得分:14)

You don't need to mock it:

        var sb = new StringBuilder();
        TextWriter w = new StringWriter(sb);
        var context = new HttpContext(new HttpRequest("", "http://www.example.com", ""), new HttpResponse(w));

        HttpContext.Current = context;

        Console.WriteLine(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority));

答案 1 :(得分:2)

HttpContext单例不能轻易模拟,也不能很好地与单元测试一起使用,因为它将您与IIS基础结构联系在一起。

Moles也可以胜任这项工作,但真正的问题是与IIS的密切联系。

您应该将相关的请求数据(例如,在您的情况下为url)传递给您的函数或类,以便能够将您的逻辑与基础结构隔离开来。这样,您就可以将它与IIS分开,并轻松地在测试基础架构上运行它。

答案 2 :(得分:0)

基本上,有两种可能性:

  1. 使用TypeMock IsolatorMoles模拟HttpContext
  2. 为整个HttpContext类或仅为UrlHelper引入一个接口,并将实现该接口的类的实例传递到您的类中。关键字:依赖注入(DI)

答案 3 :(得分:0)

我不知道你正在为这个代码编写什么类型的项目,但如果它是一个MVC项目,我建议重新编写代码以使用HttpContextBase - 如果可能的话。然后你可以创建一个存根或模拟这个并为你的测试注入。 Request.Url返回System.Uri,所以你必须创建一个这样的实例并在你的上下文stub / mock上设置它。

答案 4 :(得分:0)

以上示例:

 $rootScope.AlertsGlobal = {};

    this.updateHeight = function (clientHeight) {
    $rootScope.AlertsGlobal.clientHeight = clientHeight;

};