0

次のコントローラーメソッドがあります

    public ActionResult Create(Category category)
    {
        //default values
        if (string.IsNullOrEmpty(category.GeoAreaLevelIdentifier))
        {
            category.GeoAreaLevelIdentifier = "OutputArea";
        }                
        category.CreatorIdentifier = EsdContext.User.UniqueIdentifier.ToString();            
        category.Created = DateTime.Now;

        //validation
        RevalidateModel(category);

        new CategoryBroker().Create(category);
        return JsonNow(category);
    }

モデルにいくつかのデフォルト値を入力し、それを検証します。これは、クライアント コードが一部の必須フィールドなしでモデルを送信できるためです。欠落しているフィールドはコントローラーによって埋められます (上記を参照)。

RevalidateModel メソッドは TryValidateModel を呼び出します。

    protected void RevalidateModel(object model)
    {
        ModelState.Clear();
        TryValidateModel(model); //called explicitly since model has been updated
        if (!ModelState.IsValid)
        {
            //error message
        }
    }

しかし、単体テストから Create メソッドを呼び出すと、TryValidateModel が controllerContext を想定しているため失敗します。

     Value cannot be null.Parameter name: controllerContext

この問題を解決する最善の方法は何ですか? MvcContrib TestHelper などで controllerContext を作成する必要がありますか?

4

1 に答える 1

0

この場合

using Moq;
.........
        readonly MockRepository _mockRepository = new MockRepository(MockBehavior.Default);
.........
        controller.ControllerContext = _mockRepository.Create<ControllerContext>().Object;

十分に機能します。

一番。

于 2015-07-31T07:55:16.947 に答える