Подтвердить что ты не робот

Тестирование компонента Windsor Castle с использованием образа PerWebRequest

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

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

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

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

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

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

Фер

4b9b3361

Ответ 1

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

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

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

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

container.Kernel.ComponentModelCreated += Kernel_ComponentModelCreated;

...

void Kernel_ComponentModelCreated(Castle.Core.ComponentModel model)
{
    if (model.LifestyleType == LifestyleType.Undefined)
        model.LifestyleType = LifestyleType.Transient;
}

Ответ 2

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

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

Ответ 3

Начиная с версии 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);
    }
}