1. ホーム
  2. asp.net-mvc

MVCの検証におけるユニットテスト

2023-08-05 21:14:14

質問

MVC 2 Preview 1でDataAnnotation検証を使用している場合、エンティティの検証時にコントローラのアクションが正しいエラーをModelStateに置くことをどのようにテストすればよいでしょうか。

いくつかのコードで説明します。 まず、アクションです。

    [HttpPost]
    public ActionResult Index(BlogPost b)
    {
        if(ModelState.IsValid)
        {
            _blogService.Insert(b);
            return(View("Success", b));
        }
        return View(b);
    }

そして、これは合格するはずなのに合格していないユニットテストです(MbUnit & Moqを使用)。

[Test]
public void When_processing_invalid_post_HomeControllerModelState_should_have_at_least_one_error()
{
    // arrange
    var mockRepository = new Mock<IBlogPostSVC>();
    var homeController = new HomeController(mockRepository.Object);

    // act
    var p = new BlogPost { Title = "test" };            // date and content should be required
    homeController.Index(p);

    // assert
    Assert.IsTrue(!homeController.ModelState.IsValid);
}

この質問に加え、推測ですが バリデーションをテストすべきなのか、また、このような方法でテストすべきなのか?

どのように解決するのですか?

を渡す代わりに BlogPost を渡す代わりに、actions パラメータを FormCollection . そして BlogPost を自分で作って UpdateModel(model, formCollection.ToValueProvider()); .

これで FormCollection .

    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
        var b = new BlogPost();
        TryUpdateModel(model, form.ToValueProvider());

        if (ModelState.IsValid)
        {
            _blogService.Insert(b);
            return (View("Success", b));
        }
        return View(b);
    }

テストでは、空のままにしたいビューフォームのすべてのフィールドにNULL値を追加することを確認してください。

私は、数行の余分なコードを犠牲にして、この方法で行うことで、ユニットテストが実行時に呼び出されるコードとより近くなり、より価値のあるものになることを発見しました。また、int プロパティにバインドされたコントロールに誰かが "abc" を入力したときに何が起こるかをテストすることもできます。