2011-09-29 10 views
5

Mam następujący Kontroler:Jak testować kod stanu HTTP ustawiony przez działanie ASP.NET MVC z MSpec

public sealed class SomeController : Controller 
{ 
    public ActionResult PageNotFound() 
    { 
     Response.StatusCode = 404; 

     return View("404"); 
    } 
} 

I stworzyli specyfikację MSpec:

[Subject(typeof (SomeController))] 
public class when_invalid_page_is_requested : SomeControllerSpec 
{ 
    Because of =() => result = Controller.PageNotFound(); 

    It should_set_status_code_to_404 = 
     () => Controller.Response.StatusCode.ShouldEqual(404); 
} 

public abstract class SomeControllerSpec 
{ 
    protected static HomeController Controller; 

    Establish context =() => { Controller = new SomeController(); }; 
} 

Ale ze względu na to, jak Inicjuję kontroler, HttpContext ma wartość NULL. Jaki byłby najlepszy sposób przetestowania kodu statusu ustawionego przez działanie PageNotFound?

EDIT: Wysłany odpowiedź poniżej

Odpowiedz

6

znalazł sposób, aby to zrobić za pomocą Min.

[Subject(typeof (SomeController))] 
public class when_invalid_page_is_requested : SomeControllerSpec 
{ 
    Because of =() => result = Controller.PageNotFound(); 

    It should_set_status_code_to_404 = 
     () => HttpResponse.VerifySet(hr => hr.StatusCode = 404); 
} 

public abstract class SomeControllerSpec 
{ 
    protected static SomeController Controller; 
    protected static Mock<ControllerContext> ControllerContext; 
    protected static Mock<HttpResponseBase> HttpResponse; 

    Establish context =() => 
    { 
     ControllerContext = new Mock<ControllerContext>(); 
     HttpResponse = new Mock<HttpResponseBase>(); 
     ControllerContext.SetupGet(cc => cc.HttpContext.Response) 
         .Returns(HttpResponse.Object); 

     Controller = new SomeController 
         { 
          ControllerContext = ControllerContext.Object 
         }; 
    }; 
} 

Niezbyt elegancki. Jeśli potrafisz wymyślić lepszy sposób - daj mi znać.

3

można użyć:

_controller.Response.StatusCode 
+0

Zaktualizowałem moje pytanie z dodatkowymi informacjami. –

+0

Najpierw musisz wyśmiać. Na przykład wywołując 'controller.SetMockControllerContext()' z https://gist.github.com/johnnyreilly/4959924#file-mvcmockhelpers-cs. –

3

Inną opcją korzystania MvcContrib „s TestControllerBuilder ...

var myController = new MyController(); 

var testControllerBuilder = new TestControllerBuilder(); 
testControllerBuilder.InitializeController(myController); 

a następnie przy użyciu NUnit (Przypuszczam wersja Moq będzie działać tak jak trzeba go) ...

myController.Response.AssertWasCalled(response => response.StatusCode = 400); 

Wszystkie brzydkie prace instalacyjne i szydercze wciąż trwają, ale w MvcContrib zamiast w teście. Oto post na using the TestControllerBuilder.

Powiązane problemy