0

検証を拡張するために、次の記事に基づいて独自のモデル バインダーを作成しました: http://www.howmvcworks.net/OnModelsAndViewModels/TheBeautyThatIsTheModelBinder

私のアプリケーションでは、次のように Person エンティティを拡張します。

[MetadataType(typeof (PersonMetaData))] public partial class Person { }

public class PersonMetaData { [CustomRegularExpression(@"(\w|.)+@(\w|.)+", ErrorMessage = "電子メールが無効です")] public string Name; }

私の global.asax は次のようになります。

        protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        //Change default modelbinding
        ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

    }

PersonController の作成イベントを呼び出し、提供された電子メールが無効な場合、ModelState.Valid フィールドは false です。

次に、create メソッドの単体テストを作成します。

    [TestInitialize()]
    public void MyTestInitialize()
    {

        RegisterRoutes(RouteTable.Routes);

        //Change default modelbinding
        ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

    }
    /// <summary>
    ///A test for Create
    ///</summary>
    // TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example,
    // http://.../Default.aspx). This is necessary for the unit test to be executed on the web server,
    // whether you are testing a page, web service, or a WCF service.
    [TestMethod()]
    public void CreateTest()
    {

        PersonController controller = new PersonController();
        Person Person = new Person();

        Person.Email = "wrognmail.de

            var validationContext = new ValidationContext(Person, null, null);
        var validationResults = new List<ValidationResult>();
        Validator.TryValidateObject(Person, validationContext, validationResults, true);
        foreach (var validationResult in validationResults)
        {
            controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
        }

        ActionResult actual;
        actual = controller.Create(Person);

        // Make sure that our validation found the error!
        Assert.IsTrue(controller.ViewData.ModelState.Count == 1, "err.");
    }

コードをデバッグすると、ModelState.Valid 属性がエラーがないことを示しています。DefaultBinder の登録がうまくいかなかったと思います。

単体テストで DefaultBinder を登録するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

0

この質問とダーリンの答えを見てください。モデル バインダーをテストする方法です。

于 2012-05-17T17:26:18.740 に答える