У меня есть функция в контроллере, который я тестирую, и ожидает значений в заголовке HTTP-запроса. Я не могу инициализировать HttpContext, потому что он доступен только для чтения.
Моя функция контроллера ожидает значение заголовка HTTP-запроса для "идентификатора устройства"
[TestMethod]
public void TestValuesController()
{
ValuesController controller = new ValuesController();
//not valid controller.HttpContext is readonly
//controller.HttpContext = new DefaultHttpContext();
var result = controller.Get();
Assert.AreEqual(result.Count(), 2);
}
Есть ли простой способ сделать это без использования сторонней библиотеки?
c#
asp.net-mvc
unit-testing
asp.net-core
Джеймс Вежба
источник
источник
Ответы:
Мне удалось инициализировать httpcontext и заголовок следующим образом:
[TestMethod] public void TestValuesController() { ValuesController controller = new ValuesController(); controller.ControllerContext = new ControllerContext(); controller.ControllerContext.HttpContext = new DefaultHttpContext(); controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317"; var result = controller.Get(); //the controller correctly receives the http header key value pair device-id:20317 ... }
источник
Вместо того, чтобы издеваться над HTTPContext, вероятно, лучше сопоставить заголовок с параметром метода. Например, в контроллере в нижней части этого ответа
id
параметру присваивается значение заголовка с именем, равным «идентификатор устройства» ... Затем модульный тест становится[TestMethod] public void TestValuesController() { ValuesController controller = new ValuesController(); var result = controller.GetHeaderValue("27"); Assert.AreEqual(result, "27"); }
Хотя вы можете издеваться над HttpContext, на мой взгляд, этого следует избегать, если у вас нет выбора. Документацию для FromHeaderAttribute можно найти здесь FromHeaderAttribute Class .
public class ValuesController: Controller { public string GetHeaderValue([FromHeader(Name = "device-id")] string id) { return id; } }
источник