質問

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"]);
 }
}

しかし、今のアクション属性で宣言されたフィルタを含む、統合テストのためのパイプライン全体を実行するために?

編集: 私は、ビューのレンダリング、宣言型フィルターと一緒にちょうどコントローラロジックに興味がないんだ。

私はアクションフィルタにビューのセットアップロジックを大量に移動するというアイデアが好き、と私は統合テストの余分なレベルを必要とするかどうかわからないんだけど、またはそれがより良いセレンで行われる?

役に立ちましたか?

解決

あなたは、フィルタのホールドを取得し、それらを実行することができます。

ので、仮定actionAction<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);

遊びにビュー・エンジンを取得する(可能性が)複雑ですが、私はテストがコントローラロジックと一緒にビューを生成することを考えてあまりにも多くの移動が関与して、

不当なメンテナンスの手間を負担します
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top