Полный вызов монорельсового действия в тестах
BaseControllerTest.PrepareController достаточно для настройки свойств контроллера, таких как PropertyBag и Context
[TestClass]
public ProjectsControllerTest : BaseControllerTest
{
[TestMethod]
public void List()
{
// Setup
var controller = new ProjectsController();
PrepareController(controller);
controller.List();
// Asserts ...
Assert.IsInstanceOfType(typeof(IEnumerable<Project>),controller.PropertyBag["Projects"]);
}
}
Но теперь, чтобы запустить весь конвейер для интеграционного тестирования, включая фильтры, объявленные в атрибутах действий?
РЕДАКТИРОВАТЬ: я не заинтересован в рендеринге представления, просто логика контроллера вместе с декларативными фильтрами.
Мне нравится идея переноса значительного количества логики настройки представления в фильтры действий, и я не уверен, что мне нужен дополнительный уровень интеграционных тестов, или это лучше сделать с Selenium?
1 ответ
Вы можете получить фильтры и запустить их.
так что, предполагая action
является Action<YourController>
, а также controller
является экземпляром тестируемого контроллера,
var filtersAttributes = GetFiltersFor(controller); // say by reflecting over its attributes
var filters = filtersAttributes
.OrderBy(attr => attr.ExecutionOrder)
.Select(attr => new { Attribute = attr, Instance =
(IFilter)Container.Resolve(attr.FilterType) }); // assuming you use IoC, otherwise simply new the filter type with Activator.CreateInstance or something
Action<ExecuteWhen> runFilters = when =>
{
// TODO: support IFilterAttributeAware filters
foreach (var filter in filters)
if ((filter.Attribute.When & when) != 0)
filter.Instance.Perform(when, Context, controller, controllerContext);
};
// Perform the controller action, including the before- and after-filters
runFilters(ExecuteWhen.BeforeAction);
action(controller);
runFilters(ExecuteWhen.AfterAction);
Заставить игровой движок работать хитрее (хотя и возможно), но я думаю, что тестирование сгенерированных представлений вместе с логикой контроллера требует слишком большого количества движений и неоправданного обслуживания