Тестирование Виндзорского Замка Замка с образом жизни PerWebRequest - PullRequest
16 голосов
/ 25 апреля 2011

Я пытаюсь провести некоторое тестирование с включенным замком windsor, в одном из моих тестов я хочу проверить установщики windsor, поэтому я проверяю, может ли контейнер разрешать мои компоненты, учитывая его интерфейс.

Пока все хорошо, проблема начинается, когда компонент имеет образ жизни PerWebRequest в своей программе установки, сначала он жаловался на HttpContext.Current имеет значение null, решив эту проблему, создав поддельный контекст в настройке теста. исключение в тесте nunit

System.Exception: похоже, вы забыли зарегистрировать модуль http Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule Добавьте '' в раздел на вашем web.config. Если вы используете IIS7 в интегрированном режиме, вам нужно добавить его в раздел под

Поскольку я запускаю это из NUnit, как я могу зарегистрировать модуль или класс в windsor, чтобы он работал, или как его можно смоделировать, поскольку в этом тесте на самом деле это не веб-запрос, а просто проверка того, что контейнер разрешает тип.

И то же самое произойдет, если я проведу какие-либо интеграционные тесты с этим компонентом вне реального веб-запроса, есть ли способ заставить это работать или действительно смоделировать веб-запрос, чтобы можно было запустить эти тесты?

Транки заранее

Fer

Ответы [ 3 ]

17 голосов
/ 25 апреля 2011

В своем тесте вы можете подписаться на событие ComponentModelCreated и изменить образ жизни ваших компонентов для каждого веб-запроса на другое. (* 1 001 * Пример ).

Если вы пишете интеграционный тест с объемом одного запроса, синглтон должен это сделать.

Если вы пишете интеграционный тест, охватывающий несколько запросов, вы можете использовать контекстный образ жизни для имитации объема запросов.

Редактировать: включая код из примера (который больше не доступен):

container.Kernel.ComponentModelCreated += Kernel_ComponentModelCreated;

...

void Kernel_ComponentModelCreated(Castle.Core.ComponentModel model)
{
    if (model.LifestyleType == LifestyleType.Undefined)
        model.LifestyleType = LifestyleType.Transient;
}
0 голосов
/ 19 июня 2019

Начиная с версии 5 Windsor принятый ответ не будет работать, если вы используете Castle.Facilities.AspNet.SystemWeb.WebRequestScopeAccessor, потому что стиль жизни PerWebRequest уже ограничен.

Я получил его, изменив делегат ComponentModelCreated на следующее:

void Kernel_ComponentModelCreated(Castle.Core.ComponentModel model)
{
    const string CastleScopeAccessorType = "castle.scope-accessor-type";

    if (model.ExtendedProperties.Contains(CastleScopeAccessorType))
    {
        model.ExtendedProperties.Remove(CastleScopeAccessorType);
    }
}
0 голосов
/ 12 июня 2019

Если вы также хотите проверить, соответствует ли тип области действия веб-запросу, вы также можете сделать это

var isPerWebRequestScope = JsonConvert.SerializeObject(model.ExtendedProperties).Contains("Castle.Facilities.AspNet.SystemWeb.WebRequestScopeAccessor")
...