Как выполнить модульное тестирование статического метода, используя поддельный объект для зависимости? - PullRequest
1 голос
/ 20 августа 2009

У меня есть готовый объект Fake для HttpRequest (обертка и интерфейс) ... поскольку мне не нужно вызывать конструктор, как я могу передать поддельный HttpRequest, не нарушая интерфейс этого метода?

public static int ParseQueryInt(string key, int defaultValue)
{
   NameValueCollection nvc;
   if (HttpContext.Current.Request.QueryString["name"] != null)
   {
      //Parse strings.
   }
}

РЕДАКТИРОВАТЬ: решение Аксельсона является наиболее креативным, и это доказательство концепции сработало, к моему большому удивлению, хотя я также использовал решение Skeet, поскольку оно выглядит более вероятным в любых ситуациях.

public class Class1
{  
    [Test]
    public void Test()
    {
        HttpContext.Current = new HttpContext(
new HttpRequest("test.aspx", "http://test.com/test.aspx", "querystring=value"),
new HttpResponse(new StringWriter())
);
        Assert.AreEqual(HttpContext.Current.Request.QueryString["querystring"], "value");
    }
}

Ответы [ 2 ]

7 голосов
/ 20 августа 2009

Одна опция - это ввести другую перегрузку:

public static int ParseQueryInt(string key, int defaultValue)
{
    return ParseQuery(key, defaultValue, HttpContext.Current.Request);
}

public static int ParseQueryInt(string key, int defaultValue, 
                                HttpRequest request)
{
   NameValueCollection nvc;
   if (request.QueryString["name"] != null)
   {
      //Parse strings.
   }
}

Затем вы сводите свой «непроверяемый» (или, по крайней мере, «трудно тестируемый») код к простому перенаправлению ... вы можете протестировать версию, которая принимает запрос.

4 голосов
/ 20 августа 2009

Вы можете установить HttpContext.Current для своего собственного экземпляра:

HttpContext.Current = new HttpContext(
    new HttpRequest("test.aspx","http://test.com/test.aspx","querystring=value"),
    new HttpResponse(new StringWriter())
);

Это может быть полезно, если вы не хотите менять метод до того, как он будет проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...