テストで全体モノレールアクションの呼び出し
-
18-09-2019 - |
質問
BaseControllerTest.PrepareControllerは、PropertyBagように、コントローラのプロパティの設定のために十分であるとコンテキスト
[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"]);
}
}
しかし、今のアクション属性で宣言されたフィルタを含む、統合テストのためのパイプライン全体を実行するために?
編集: 私は、ビューのレンダリング、宣言型フィルターと一緒にちょうどコントローラロジックに興味がないんだ。
私はアクションフィルタにビューのセットアップロジックを大量に移動するというアイデアが好き、と私は統合テストの余分なレベルを必要とするかどうかわからないんだけど、またはそれがより良いセレンで行われる?
解決
あなたは、フィルタのホールドを取得し、それらを実行することができます。
ので、仮定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