Мокинг HttpContext не работает

Я пытаюсь издеваться над HttpContext, чтобы я мог выполнить модульное тестирование вызова Request.IsAuthenicated моего контроллера. Я использую блог код, который я нашел у Скотта Хансельмана для моделирования HttpContext с помощью rhino.mocks. Итак, у меня есть этот образец модульного теста:

PostsController postsController = new PostsController(postDL);
mocks.SetFakeControllerContext(postsController);
Expect.Call(postsController.Request.IsAuthenticated).Return(true);

В моем действии контроллера у меня есть что-то вроде if (Request.IsAuthenticated).... когда я пытаюсь запустить модульный тест, тест не генерирует нулевое исключение, а когда я пытаюсь отладить модульный тест, я вижу, что HttpContext никогда не назначается контроллеру. есть идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
5 161
6

Ответы 6

Теперь, для раскрытия, мне еще предстоит пачкать руки с большинством вещей, с которыми вы работаете, однако:

Если вы хотите издеваться над IsAuthenticated, почему бы просто не создать статический класс, чтобы возвращать bool, которым можно управлять с помощью вашего тестового кода?

Это немного грубовато, но, надеюсь, вы уловили идею:

interface IAuthenticationChecker
{
    bool IsAuthenticated { get; }
}

public class MockAuthenticationChecker : IAuthenticationChecker
{
    static bool _authenticated = false;

    public static void SetAuthenticated(bool value)
    {
        _authenticated = value;
    }
    #region IAuthenticationChecker Members

    public bool IsAuthenticated
    {
        get { return _authenticated; }
    }

    #endregion
}

public class RequestAuthenticationChecker : IAuthenticationChecker
{

    #region IAuthenticationChecker Members

    public bool IsAuthenticated
    {
        get {
            if (HttpContext.Current == null)
                throw new ApplicationException(
                    "Unable to Retrieve IsAuthenticated for Request becuse there is no current HttpContext.");

            return HttpContext.Current.Request.IsAuthenticated;
        }
    }

    #endregion
}

Затем вы можете использовать ссылку на любом уровне приложения, да, это означает, что вам нужно добавить ссылку на уровне приложения, и вам нужно использовать другую ссылку, а не Request, но вы также получаете полный контроль над аутентификацией для тестирования :)

К вашему сведению - это полностью открыто для разлета, я собрал его примерно за минуту :)

Это может быть полезно для вас, сработало для меня в аналогичном сценарии:

http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

это метод грубой силы, когда у вас нет HttpContextBase и связанных абстрактных базовых классов

Ben Scheirman 19.11.2008 00:57

В комментариях есть ссылка, у меня работала: web.archive.org/web/20080731141201/http://haacked.com/code/…

Ivan Gerken 11.04.2011 14:30

Это должно работать:

PostsController postsController = new PostsController(postDL);
var context = mocks.Stub<HttpContextBase>();
var request = mocks.Stub<HttpRequestBase>();
SetupResult.For(request.IsAuthenticated).Return(true);
SetupResult.For(context.Request).Return(request);    
postsController.ControllerContext = new ControllerContext(context, new RouteData(), postsController);

Вы можете найти сообщение, которое я написал об этом, как в некотором роде http://santoshbenjamin.wordpress.com/2008/08/04/mock-httpcontext-and-session-state/

ваше здоровье Бенджи

Вот один простой способ подделать контекст, найденный в Блог Джеффа:

        TextWriter tw = new StringWriter();
        HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", "c:\\inetpub\\wwwroot\\webapp\\", "default.aspx", "", tw);
        HttpContext.Current = new HttpContext(wr);

Вот класс, который может быть полезен. Он обрабатывает запросы ajax, аутентификацию пользователей, параметры запроса и многое другое: https://gist.github.com/3004119

Другие вопросы по теме