Mam funkcję w kontrolerze, który jest testem jednostkowym, który oczekuje wartości w nagłówku żądania http. Nie mogę zainicjować HttpContext, ponieważ jest on tylko do odczytu.
Funkcja mojego kontrolera oczekuje wartości nagłówka żądania http dla „device-id”
[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);
}
Czy istnieje prosty sposób na zrobienie tego bez korzystania z biblioteki innej firmy?
c#
asp.net-mvc
unit-testing
asp.net-core
James Wierzba
źródło
źródło
Odpowiedzi:
Udało mi się zainicjować httpcontext i nagłówek w ten sposób:
[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 ... }
źródło
Zamiast wyszydzać HTTPContext, prawdopodobnie lepszym pomysłem jest zamapowanie nagłówka na parametr metody. Na przykład w kontrolerze na dole tej odpowiedzi
id
parametr jest ustawiony na nagłówek wartości o nazwie równej „identyfikator urządzenia” ... Test jednostkowy staje się wtedy[TestMethod] public void TestValuesController() { ValuesController controller = new ValuesController(); var result = controller.GetHeaderValue("27"); Assert.AreEqual(result, "27"); }
Podczas można drwić HttpContext, moim zdaniem to jest coś, co powinno się unikać, chyba że nie masz wyboru. Dokumentację dotyczącą FromHeaderAttribute można znaleźć tutaj FromHeaderAttribute Class .
public class ValuesController: Controller { public string GetHeaderValue([FromHeader(Name = "device-id")] string id) { return id; } }
źródło