在整个测试单轨动作调用
-
18-09-2019 - |
题
BaseControllerTest.PrepareController是足够的控制器属性设置,如属性包和上下文
[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做了什么?
解决方案
您可以得到滤波器的举行,并运行它们。
因此,假定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);
获取的视图发动机发挥是棘手(虽然可能的),但我认为测试产生与控制器逻辑是涉及太多的移动和招致不合理的维护工作沿观点
不隶属于 StackOverflow