2011-09-29 9 views
5

tengo el siguiente controlador:Cómo probar el código de estado HTTP establecido por una acción ASP.NET MVC con MSpec

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

     return View("404"); 
    } 
} 

He creado una especificación 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(); }; 
} 

Pero debido a la forma Instancia el controlador, HttpContext es nulo. ¿Cuál sería la mejor manera de probar el código de estado establecido por la acción PageNotFound?

EDIT: Publicado una respuesta por debajo de

Respuesta

6

encontrado una manera de hacerlo utilizando Moq.

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

No muy elegante. Si puedes pensar en una mejor manera, házmelo saber.

3

Se puede utilizar:

_controller.Response.StatusCode 
+0

He actualizado mi pregunta con más información. –

+0

Primero tiene que burlarse de él. Por ejemplo, llamando a 'controller.SetMockControllerContext()' desde https://gist.github.com/johnnyreilly/4959924#file-mvcmockhelpers-cs. –

3

Otra opción usando MvcContrib 's TestControllerBuilder ...

var myController = new MyController(); 

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

y luego usando NUnit (supongo que la versión Moq funcionaría igual que lo tienes) ...

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

Toda la instalación fea y el trabajo de burla todavía se está realizando, pero por MvcContrib en lugar de dentro de la prueba. Aquí hay una publicación en using the TestControllerBuilder.

Cuestiones relacionadas