Тестирование компонента Windsor Castle с использованием образа PerWebRequest
Я пытаюсь провести некоторое тестирование с участием виндзора замка, в одном из моих тестов я хочу проверить установщики Windsor, поэтому я проверяю, что контейнер может разрешать мои компоненты с учетом его интерфейса.
До сих пор, так хорошо, проблема начинается, когда у компонента есть стиль PerWebRequest в его установщике, сначала он жаловался на HttpContext.Current является нулевым, имея тот, который решил создать поддельный контекст в тестовой настройке. У меня теперь есть это исключение в тесте nunit
System.Exception: похоже, что вы забыли зарегистрировать модуль http Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule
Добавьте '' в раздел вашего web.config. Если вы запускаете IIS7 в интегрированном режиме, вам нужно добавить его в раздел под
Как я запускаю это из NUnit, как я могу зарегистрировать модуль или класс в Windsor, чтобы он работал, или как можно издеваться, так как в этом тесте на самом деле нет веб-запроса, просто проверяя, что контейнер разрешает тип.
И также это произойдет, если я сделаю какие-либо интеграционные тесты с этим компонентом вне реального веб-запроса, есть ли способ сделать эту работу или действительно издеваться над веб-запросом, чтобы эти тесты могли быть запущены?
Транки заранее
Фер
Ответы
Ответ 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);
}
}