Todo invocação acção monocarril em testes
-
18-09-2019 - |
Pergunta
BaseControllerTest.PrepareController é suficiente para controlador de configuração de propriedades, tais como PropertyBag e Contexto
[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"]);
}
}
Mas agora para executar toda a pipeline para testes de integração, incluindo filtros declarou em atributos de ação?
EDIT: Eu não estou interessado na prestação de vista, apenas a lógica do controlador, juntamente com filtros declarativas.
Eu gosto da idéia de mover quantidade significativa de lógica de configuração vista em filtros de ação, e eu não tenho certeza se eu preciso de nível extra de testes de integração, ou é melhor feito com Selenium?
Solução
Você pode obter um porão dos filtros, e executá-los.
então, assumindo action
é Action<YourController>
, e controller
é um exemplo do controlador sob teste,
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);
Obtendo o ponto de vista motor de jogo é mais complicado (embora possível), mas acho que os testes visualizações geradas juntamente com a lógica do controlador está envolvendo a forma como muitos em movimento e incorrer esforço de manutenção injustificada