Полный вызов монорельсового действия в тестах

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);

Заставить игровой движок работать хитрее (хотя и возможно), но я думаю, что тестирование сгенерированных представлений вместе с логикой контроллера требует слишком большого количества движений и неоправданного обслуживания

Другие вопросы по тегам