Nano Hash - криптовалюты, майнинг, программирование

Как проверить код состояния HTTP, установленный действием ASP.NET MVC, с помощью MSpec

У меня есть следующий контроллер:

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

        return View("404");
    }
}

Я создал спецификацию 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(); };
}

Но из-за того, как я создаю экземпляр контроллера, HttpContext имеет значение null. Как лучше всего проверить код состояния, установленный действием PageNotFound?

EDIT: ответ размещен ниже


Ответы:


1

Нашел способ сделать это с помощью 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
                         };
    };
}

Не очень элегантно. Если вы можете придумать лучший способ - дайте мне знать.

29.09.2011

2

Вы можете использовать:

_controller.Response.StatusCode
29.09.2011
  • Вы должны издеваться над ним в первую очередь. Например, вызвав controller.SetMockControllerContext() из gist.github.com/johnnyreilly/4959924#file- mvcmockhelpers-cs. 11.06.2015

  • 3

    Другой вариант использования TestControllerBuilder MvcContrib...

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

    а затем с помощью NUnit (думаю, версия Moq будет работать так же, как и у вас)...

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

    Вся уродливая работа по настройке и насмешкам все еще выполняется, но MvcContrib, а не внутри теста. Вот сообщение об использовании TestControllerBuilder.

    06.12.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..