Как написать модульный тест для HttpContext.Current.Request.Headers

Ниже приведен пример.

public class MyController : Controller
{
    [Route("~/api/mycontroller")]
    [HttpGet]
    public int ID()
    {
        try
        {
            return somecontroller.getID(ID);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

Над ним контроллер, который извлекает идентификатор из нижнего контроллера. Ниже находится контроллер, который он унаследовал.

public class Controller : ApiController
{
    public int ID
    {
        get
        {
            return int.Parse(HttpContext.Current.Request.Headers["ID"]);
        }
    }
}

Как мне написать модульный тест для следующего.???


person Salman Khan    schedule 28.12.2015    source источник


Ответы (1)


О, модульное тестирование HttpContext.Current. Это один из моих любимых :-)

Вы не можете написать модульный тест для чего-то, что зависит от HttpContext.Current. Итак, если вы хотите написать тестируемый код, первым шагом будет поиск во всем вашем решении ключевого слова HttpContext.Current и просто стереть его с лица земли.

В этом конкретном случае вы, конечно, замените их соответствующей абстракцией:

public class Controller : ApiController
{
    public int ID
    {
        get
        {
            return int.Parse(Request.Headers.GetValues("ID").FirstOrDefault());
        }
    }
}

Теперь совершенно тривиально правильно протестировать контроллер веб-API:

// arrange
var sut = new MyController();
sut.Request = new HttpRequestMessage();
sut.Request.Headers.TryAddWithoutValidation("ID", "5");


// act
var actual = sut.SomeControllerAction();

// assert
Assert.AreEqual(5, actual);
person Darin Dimitrov    schedule 28.12.2015
comment
Спасибо Дарин за быстрый ответ. Оцените это. Не решает проблему (ID).FirstOrDefault не работает. Говорит не содержит определения. :( - person Salman Khan; 28.12.2015
comment
Ну, трудно сказать, что ты мог сделать не так. Это сработало для меня отлично. - person Darin Dimitrov; 29.12.2015
comment
@DarinDimitrov Можно выполнить модульное тестирование с помощью HttpContext, просто установите HttpContext.Current = new HttpContext(new HttpRequest(, example.com, ), новый HttpResponse(new StringWriter())); и вы можете получить его из кода. (Ваш ответ правильный, просто хочу уточнить, что это возможно и иногда полезно) - person Andreas; 12.01.2016