2

取得したものが T4MVC_ActionResult である場合、コントローラー アクションからレンダリングされたビューをテストするにはどうすればよいですか? 通常の状況では、例のように TestHelper のメソッドを直接使用できるはずです。

pooController.Details().AssertViewRendered().ForView("Details")

...しかし、T4MVC を介して ViewResult ではなく T4MVC_ActionResult を取得するため、この部分AssertViewRendered<>().ForView("Details")は失敗します。どのビューが呼び出されたかをテストしたい場合、どのような代替手段がありますか?


アップデート:

テストコードは次のとおりです。

[TestMethod]
public void Theme_Controller_Details_Action_Returns_Details_View()
{
    var builder = new TestControllerBuilder();
    var mockThemeRepository = new Mock<IThemeRepository>();
    var themeController = builder.CreateController<Evalgrid.Website.Controllers.ThemeController>(mockThemeRepository.Object);
    builder.InitializeController(themeController);

    var result = themeController.Details();
    result.AssertViewRendered().ForView("Details");
}

行の後にブレークポイントを設定するデバッガーを使用しました。resultその変数の型は T4MVC_ActionResult で、themeController はEvalgrid.Website.controllers.ThemeController. コントローラーの完全修飾名を使用したことに注意してください。

私はこれを得る:

予想される結果は、ViewResult 型である必要があります。実際には T4MVC_ActionResult 型です。

何が起こっているのかわかりません。

4

1 に答える 1

1

実際、T4MVCはここで違いを生むべきではありません。コントローラを直接インスタンス化してアクションメソッドを呼び出すと、T4MVCを使用するかどうかに関係なく、同じことが返されます。つまり、T4MVC_ActionResultは取得されません。

T4MVC_ActionResultを取得するのは、MVC.Foo.Details()を記述した場合のみです。これは、MVC.Fooが、コントローラークラスを直接返すのではなく、特別なことを行う派生クラスのインスタンスを返すためです。

それは理にかなっていますか?

更新:TestControllerBuilder.CreateControllerのソースを見ると、混乱しています。

public T CreateController<T>(params object[] constructorArgs) where T : Controller
{
  var controller = (Controller)Activator.CreateInstance(typeof(T), constructorArgs);
  InitializeController(controller);
  return controller as T;
}

つまり、渡すタイプを直接インスタンス化するので、通常のアクションを呼び出すだけです。

コードに関する1つの質問:Detailsアクションメソッドはパラメーターを取りますか?もしそうなら、パラメータなしで呼び出しているので、それは問題を説明します。これは、部分クラスに追加されたT4MVCメソッドになります。

于 2010-07-22T04:48:20.960 に答える