3

ASP.NET MVC 3 プロジェクトで T4MVC を使用しています。次の基本的なテストがあります。

[TestMethod]
public void IndexReturnsIndexView()
{
    var controller = new HomeController();
    var result = controller.Index();

    result.AssertViewRendered().ForView(MVC.Home.Views.Index);
}

コントローラー メソッドが既定のビューを返す場合、テストは失敗します。

public virtual ActionResult Index()
{
    return View();
}

与えられたエラーは次のとおりです。

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name '~/Views/Home/Index.cshtml', actual was ''

しかし、 をオーバーライドしてどちらを返すViewかを指定すると、テストはパスします。viewName

public virtual ActionResult Index()
{
    return View(MVC.Home.Views.Index);
}

次のアサーションを使用してみましたが、まだうまくいきません:

result.AssertViewRendered().ForView(MVC.Home.Index().GetT4MVCResult().Action);

次のエラーが発生します。

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name 'Index', actual was ''

その後、アサーションの失敗を読み間違えたことに気付いたので、テストを次のように変更しました。

result.AssertViewRendered().ForView(String.Empty);

テストはパスしますが、テスト自体は役に立たないようです。

すべてのビューを名前で指定する必要がないようにしたいので、どうすればこれをテストできますか? 明確にするために、今日 NuGet からインストールしたMvcContrib.Mvc3.TestHelper-ci 3.0.96.0を使用しています。

アップデート

これは質問に対する答えではありませんが、代わりに次のことを始めました。これにより、テスト ケースとしてより多くの価値が得られます。

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}
4

2 に答える 2

0

私はこれをかなりの時間開いたままにして、他の人が選択した場合に答えることができるようにしました. 私は今、これに自分自身で答えます。

次のチェックでは、返されたビューに期待されるモデルと、そのモデル内のより適切なデータが含まれていることを確認します。これは、問題のコントローラーのより優れた単体テストです。

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}
于 2013-01-21T15:27:56.280 に答える
0

AssertViewRendered().ForView() は、View() に明示的に渡すビュー名に対してテストし、コントローラー アクションです。あなたが行っているように、アクションでビュー名を指定しない場合、.ForView() は、ご覧のとおり、空の文字列に対してテストされます。

View("Index"); を呼び出した場合 アクションでは、テストで .ForView("Index") を呼び出すことができます。

アクションがさまざまな可能なビューを返すことができる場合、このアサーションが最も役立つと思います。

于 2013-11-15T12:28:23.560 に答える