2016-01-08 2 views
1

Я написал ErrorsController, который, как вы можете себе представить, имеет довольно простые методы для продолжения обслуживания динамического содержимого в случае ошибки, например. 500.Тестирование результата HttpResponse.StatusCode

Теперь, что я хочу сделать, это проверить, что в этом методе HttpResponseBase.StatusCode устанавливается при заданном числе при выполнении этого метода, но по какой-либо причине свойство StatusCode всегда равно 0. Это включает в себя при непосредственном изучении свойства после установки.

Контроллер

public ViewResult NotFound() 
{ 
    Response.StatusCode = (int)HttpStatusCode.NotFound; 

    const string PageTitle = "404 Page Not Found"; 
    var viewModel = this.GetViewModel(PageTitle); 

    return this.View(viewModel); 
} 

GetViewModel ничего не делает, кроме настройки свойств на модели представления

Test

[SetUp] 
public void Setup() 
{ 
    this.httpContext = new Mock<HttpContextBase>(); 
    this.httpResponse = new Mock<HttpResponseBase>(); 

    this.httpContext.SetupGet(x => x.Response).Returns(this.httpResponse.Object); 

    this.requestContext = new RequestContext(this.httpContext.Object, new RouteData()); 
    this.controller = new ErrorsController(this.contentRepository.Object); 

    this.controllerContext = new Mock<ControllerContext>(this.requestContext, this.controller); 
    this.controllerContext.SetupGet(x => x.HttpContext.Response).Returns(this.httpResponse.Object); 
    this.controller.ControllerContext = this.controllerContext.Object; 
} 

[Test] 
public void Should_ReturnCorrectStatusCode_ForNotFoundAction() 
{ 
    this.controller.NotFound(); 
    this.httpResponse.VerifySet(x => x.StatusCode = (int)HttpStatusCode.NotFound); 
    Assert.AreEqual((int)HttpStatusCode.NotFound, this.httpResponse.StatusCode); 
} 

Где я буду здесь не так?

+0

@NikolaiDante Не могли бы вы уточнить? Я только начинаю использовать тестирование – ediblecode

+0

Вызывая метод на вашем ручном инстанцированном контроллере, вы обходите весь HTTP-стек. Контекст вашего контроллера, HTTP-контекст и HTTP-ответ не используются, вы должны проверить «ViewResult», возвращаемый контроллером. – CodeCaster

+0

@CodeCaster Это не может быть правдой. Раньше (до смешения ответа/контекста). Я получаю нулевую ошибку в методе, заявляя, что 'Response' равно null. Я также вижу через отладку, что 'Response' - мой издеваемый объект (очень готов ошибаться в этом) – ediblecode

ответ

5

Просто добавьте это в фазе установки:

httpResponse.SetupAllProperties(); 

Это, как говорится, вы, вероятно, не нужны эти 2 утверждения:

this.httpResponse.VerifySet(x => x.StatusCode = (int)HttpStatusCode.NotFound); 
Assert.AreEqual((int)HttpStatusCode.NotFound, this.httpResponse.StatusCode); 

Первое должно быть более чем достаточно для вашего устройства контрольная работа.

+0

Большое спасибо! Работал отлично – ediblecode

+0

@NikolaiDante, ни один испытательный бегун не имеет значения. Вероятно, вы забыли правильно высмеять HttpContext. –

+0

@DarinDimitrov Я не спрашивал о тестовом бегуне :) – ediblecode

0

я в конечном итоге с помощью метода расширения для насмешливый HttpContext

public static class HttpContextExtensions 
{ 
    public static void MockHttpContext(this Controller controller) 
    { 
     var httpContextMock = new Mock<HttpContextBase>(); 
     var requestMock = new Mock<HttpRequestBase>(); 
     var responseMock = new Mock<HttpResponseBase>(); 

     responseMock.SetupAllProperties(); 
     requestMock.SetupAllProperties(); 

     httpContextMock.Setup(x => x.Response).Returns(responseMock.Object); 
     httpContextMock.Setup(x => x.Request).Returns(requestMock.Object); 

     controller.ControllerContext = new ControllerContext(); 
     controller.ControllerContext.HttpContext = httpContextMock.Object; 
    } 
} 

Использование:

someController.MockHttpContext() 
Смежные вопросы