Bir .NET çekirdek MVC denetleyicisini test etmek için Mock HttpContext?


103

Bir denetleyicide, http isteğinin başlığındaki değerleri bekleyen birim test ettiğim bir işlev var. HttpContext'i başlatamıyorum çünkü salt okunur.

Denetleyici işlevim, "cihaz kimliği" için bir http istek başlığı değeri bekliyor

[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);
}

Bunu üçüncü taraf bir kitaplık kullanmadan yapmanın doğrudan bir yolu var mı?


1
HttpContext kullanmıyor musunuz ? Denetleyicileri kullanmanın tüm amacı, verilerin denetleyicinin parametreleri aracılığıyla gelmesidir. Denetleyiciniz verileri bir WebForms sayfası gibi okumak için HttpContext'i kullanıyorsa, bir sorununuz var demektir.
Panagiotis Kanavos

@PanagiotisKanavos Başlıktaki değer, aramanın hangi mobil cihazdan geldiğini gösteren bir bilgi parçasıdır. Doğru veriyi almak için bu gereklidir. Kimlik doğrulama için özel bir eylem filtresi tarafından işlenen kimlik gerektiğinden, cihaz kimliği başlıktadır. Cihaz kimliğini bir rota parametresi olarak iletebilirdim, ancak gereksiz olurdu
James Wierzba

FromHeaderAttribute öğesini kontrol edin, ancak aynı zamanda kopyayı da kontrol edin. HttpContext şimdi yapılandırma yoluyla enjekte edilebilir
Panagiotis Kanavos

1
Tam olarak ne istediğinizi belirtmek için sorunuzu düzenlemenizi öneririm (mobil cihazları tanımlamak için başlık alanlarına erişim). ASP.NET dokümantasyonu, dokümantasyon sayfaları eksik, nazikçe ifade etmek gerekirse ... "geçiş" döneminden geçiyor gibi görünüyor. Mobil cihazların nasıl yönlendirileceğini soran bu neredeyse aynı soruyu kontrol edin
Panagiotis Kanavos

Yanıtlar:


238

Httpcontext ve header'ı şu şekilde başlatabildim:

[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
    ...
}

20

HTTPContext ile alay etmek yerine, başlığı yöntemdeki bir parametreye eşlemek muhtemelen daha iyi bir fikirdir. Örneğin, bu cevabın altındaki kontrolörde, idparametre "cihaz kimliği" ile eşit bir ada sahip değer başlığına ayarlanır ... Daha sonra birim testi olur

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    var result = controller.GetHeaderValue("27");
    Assert.AreEqual(result, "27");
}

Eğer iken edebilirsiniz alay HttpContext, bana göre bu seçeneğin yok olmadıkça kaçınılmalıdır bir şeydir. FromHeaderAttribute ile ilgili dokümantasyon burada FromHeaderAttribute Class bulunabilir .

public class ValuesController: Controller
{
    public string GetHeaderValue([FromHeader(Name = "device-id")] string id)
    {
        return id;
    }
}

1
Benim durumumda, IIRC, http başlığına dahil etmek bir gereklilikti çünkü aynı değerin bir .net çekirdek ara yazılım bileşeninde değerlendirilmesi gerekiyordu
James Wierzba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.