2012-03-26 21 views
11

MVC3 içinde bir kontrol cihazım var, bir şeyler yanlış giderse 500 bir cevap kodu döndürmesi gerekiyor. Bunu bir görüntüleme nesnesini döndürerek ve http yanıt kodunu 500'e eşit olarak ayarlayarak yapıyorum (bunu ateş böceğinde kontrol ettim ve her şey harika çalışıyor).MVC3 birim test yanıtı kodu

public ActionResult http500() 
{ 
    ControllerContext.HttpContext.Response.StatusCode = 500; 
    ControllerContext.HttpContext.Response.StatusDescription = "An error occurred whilst processing your request."; 

    return View(); 
} 

Şimdi sahip olduğum problem, yanıt kodunu kontrol eden bir birim testi yazabilmem gerekiyor. Yanıt koduna hem ViewResult nesnesi hem de Denetleyici içeriği aracılığıyla çeşitli şekillerde erişmeyi denedim.

İki yol da bana denetleyicide ayarladığım yanıt kodunu verir.

[TestMethod()] 
public void http500Test() 
{ 
    var controller = new ErrorController(); 
    controller.ControllerContext = new ControllerContext(FakeHttpObject(), new RouteData(), controller); 


    ViewResult actual = controller.http500() as ViewResult; 
    Assert.AreEqual(controller.ControllerContext.HttpContext.Response.StatusCode, 500); 

} 

nasıl denetleyicisinden yanıt kodu 500 alma hakkında gitmek veya bir entegrasyon test şey bu daha olacaktır.

cevap

33

daha MVCish şekilde yapıyor hakkında nasıl sonra

public ActionResult Http500() 
{ 
    return new HttpStatusCodeResult(500, "An error occurred whilst processing your request."); 
} 

ve:

// arrange 
var sut = new HomeController(); 

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

// assert 
Assert.IsInstanceOfType(actual, typeof(HttpStatusCodeResult)); 
var httpResult = actual as HttpStatusCodeResult; 
Assert.AreEqual(500, httpResult.StatusCode); 
Assert.AreEqual("An error occurred whilst processing your request.", httpResult.StatusDescription); 

veya Response nesnesi kullanmakta ısrar eğer yaratabilecek sahte bir:

// arrange 
var sut = new HomeController(); 
var request = new HttpRequest("", "http://example.com/", ""); 
var response = new HttpResponse(TextWriter.Null); 
var httpContext = new HttpContextWrapper(new HttpContext(request, response)); 
sut.ControllerContext = new ControllerContext(httpContext, new RouteData(), sut); 

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

// assert 
Assert.AreEqual(500, response.StatusCode); 
Assert.AreEqual("An error occurred whilst processing your request.", response.StatusDescription); 
bir kontrolör eylem statusCode bir modele bir görünüm hem dönerse ben olsa bu yaklaşımı, hızlı soru gibi
+2

, orada bir sens olduğunu Hem durum kodu yanıtı hem de görünüm/model sonucunu taklit etmenin yolu nedir? Mantıklı bir seçenek düşünmeye çalışıyorum. – dougajmcdonald

+0

iyi soru @dougajmcdonald. bir cevap aldın mı – richardwhatever

0

FakeHttpObject() nedir? Moq kullanılarak oluşturulan bir sahte mi? Bu durumda, gerçek değerleri bir yere saklamak için ayarlayıcıları ve alıcıları ayarlamanız gerekir. Mock<T>, özellikler ve yöntemler için herhangi bir uygulama sunmaz. Bir mülkün değerini ayarlarken, hiçbir şey olmuyor ve değer "kaybediliyor".

Diğer bir seçenek, gerçek özelliklere sahip somut bir sınıf olan sahte bir içerik sağlamaktır.