У меня есть веб-сервис, который я пытаюсь выполнить. В сервисе он вытягивает несколько значений из HttpContext
примерно так:
m_password = (string)HttpContext.Current.Session["CustomerId"];
m_userID = (string)HttpContext.Current.Session["CustomerUrl"];
в модульном тесте я создаю контекст, используя простой рабочий запрос, например:
SimpleWorkerRequest request = new SimpleWorkerRequest("", "", "", null, new StringWriter());
HttpContext context = new HttpContext(request);
HttpContext.Current = context;
Однако всякий раз, когда я пытаюсь установить значения HttpContext.Current.Session
HttpContext.Current.Session["CustomerId"] = "customer1";
HttpContext.Current.Session["CustomerUrl"] = "customer1Url";
Я получаю исключение нулевой ссылки, которое говорит, что HttpContext.Current.Session
является нулевым.
Есть ли способ инициализировать текущий сеанс в модульном тесте?
Ответы:
Нам пришлось издеваться
HttpContext
, используяHttpContextManager
и вызывая фабрику из нашего приложения, а также из модульных тестов.Затем вы должны заменить все вызовы на
HttpContext.Current
сHttpContextManager.Current
и иметь доступ к тем же методам. Затем, когда вы тестируете, вы также можете получить доступ кHttpContextManager
и высмеивать ваши ожиданияЭто пример использования Moq :
и затем, чтобы использовать его в своих модульных тестах, я вызываю это в моем методе Test Init
затем вы можете в приведенном выше методе добавить ожидаемые результаты от сеанса, которые, как вы ожидаете, будут доступны для вашего веб-сервиса.
источник
HttpContextManager
было бы лучше, чем имя,HttpContextSource
но я согласенHttpContextFactory
, вводит в заблуждение.Вы можете «подделать это», создав новый
HttpContext
как это:http://www.necronet.org/archive/2010/07/28/unit-testing-code-that-uses-httpcontext-current-session.aspx
Я взял этот код и поместил его в статический вспомогательный класс следующим образом:
Или вместо использования отражения для создания нового
HttpSessionState
экземпляра, вы можете просто прикрепить свой объектHttpSessionStateContainer
кHttpContext
(согласно комментарию Брента М. Спелла):и тогда вы можете вызвать его в своих модульных тестах, например:
источник
Server.MapPath()
не будет работать, если вы используете это тоже.Решение Milox лучше, чем принятое IMHO, но у меня были некоторые проблемы с этой реализацией при обработке URL с помощью строки запроса .
Я внес некоторые изменения, чтобы он работал правильно с любыми URL-адресами и чтобы избежать отражения.
источник
httpContext.Session
, есть идеи, как сделать то же самое дляhttpContext.Application
?Я что-то об этом говорил некоторое время назад.
Модульное тестирование HttpContext.Current.Session в MVC3 .NET
Надеюсь, поможет.
источник
Если вы используете инфраструктуру MVC, это должно работать. Я использовал Милокса FakeHttpContext и добавил несколько дополнительных строк кода. Идея пришла из этого поста:
http://codepaste.net/p269t8
Это похоже на работу в MVC 5. Я не пробовал это в более ранних версиях MVC.
источник
Вы можете попробовать FakeHttpContext :
источник
В asp.net Core / MVC 6 RC2 вы можете установить
HttpContext
RC 1 был
https://stackoverflow.com/a/34022964/516748
Рассмотреть возможность использования
Moq
источник
Ответ, который работал со мной, - это то, что написал @Anthony, но вы должны добавить еще одну строку, которая
так что вы можете использовать это:
источник
Попробуй это:
И добавить класс:
Это позволит вам тестировать как сессию, так и кеш.
источник
Я искал что-то немного менее агрессивное, чем варианты, упомянутые выше. В конце концов, я придумала глупое решение, но некоторые могли бы двигаться немного быстрее.
Сначала я создал класс TestSession :
Затем я добавил необязательный параметр в конструктор моего контроллера. Если параметр присутствует, используйте его для манипуляции сессией. В противном случае используйте HttpContext.Session:
Теперь я могу ввести свой TestSession в контроллер:
источник
Никогда не издевайтесь .. никогда! Решение довольно простое. Зачем подделывать такое красивое создание, как
HttpContext
?Нажмите сеанс вниз! (Этого достаточно для понимания большинства из нас, но подробно объяснено ниже)
(string)HttpContext.Current.Session["CustomerId"];
это то, как мы получаем к нему доступ сейчас. Изменить это наПри вызове из теста _customObject использует альтернативное хранилище (значение ключа БД или облака [ http://www.kvstore.io/] )
Но когда вызывается из реального приложения,
_customObject
используетSession
.как это сделать? хорошо ... инъекция зависимости!
Таким образом, test может установить сеанс (подземный), а затем вызвать метод приложения, как будто он ничего не знает о сеансе. Затем тест тайно проверяет, правильно ли обновил код приложения сеанс. Или если приложение ведет себя на основе значения сеанса, установленного тестом.
На самом деле, мы в конце концов насмехались, хотя я сказал: «никогда не издевайся». Поскольку мы не могли не перейти к следующему правилу, «издевайтесь там, где это меньше всего болит!». Насмешка над огромным
HttpContext
или насмешка над крошечным сеансом, что вредит меньше всего? не спрашивайте меня, откуда пришли эти правила. Давайте просто скажем здравый смысл. Вот интересное прочтение о не издевательстве, поскольку юнит-тест может убить насисточник
Ответ @Ro Hit дал мне очень помог, но мне не хватало учетных данных пользователя, потому что мне пришлось подделывать пользователя для проверки подлинности модуля. Поэтому позвольте мне описать, как я это решил.
Согласно этому , если вы добавите метод
а затем добавить
К последней строке
TestSetup
метода, который вы сделали, добавлены учетные данные пользователя, которые можно использовать для проверки подлинности.Я также заметил, что в HttpContext вам могут потребоваться другие части, такие как
.MapPath()
метод. Доступен FakeHttpContext, который описан здесь и может быть установлен через NuGet.источник
Я нашел следующее простое решение для указания пользователя в HttpContext: https://forums.asp.net/post/5828182.aspx
источник
Попробуйте так ...
источник