Saya memiliki fungsi dalam pengontrol yang saya uji unit yang mengharapkan nilai di header permintaan http. Saya tidak dapat menginisialisasi HttpContext karena hanya bisa dibaca.
Fungsi pengontrol saya mengharapkan nilai header permintaan http untuk "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);
}
Apakah ada cara mudah untuk melakukan ini tanpa menggunakan perpustakaan pihak ketiga?
c#
asp.net-mvc
unit-testing
asp.net-core
James Wierzba
sumber
sumber
Jawaban:
Saya dapat menginisialisasi httpcontext dan header dengan cara ini:
[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 ... }
sumber
Daripada mengejek HTTPContext, lebih baik memetakan header menjadi parameter pada metode. Misalnya, di pengontrol di bagian bawah jawaban ini,
id
parameter disetel ke header nilai dengan nama yang sama dengan "device-id" ... Tes unit kemudian menjadi[TestMethod] public void TestValuesController() { ValuesController controller = new ValuesController(); var result = controller.GetHeaderValue("27"); Assert.AreEqual(result, "27"); }
Meskipun Anda dapat mengejek HttpContext, menurut saya itu adalah sesuatu yang harus dihindari kecuali Anda tidak punya pilihan. Dokumentasi untuk FromHeaderAttribute dapat ditemukan di sini Kelas FromHeaderAttribute .
public class ValuesController: Controller { public string GetHeaderValue([FromHeader(Name = "device-id")] string id) { return id; } }
sumber