加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 如何使用ModelMetadata单元测试modelbinder

发布时间:2020-12-15 18:37:48 所属栏目:asp.Net 来源:网络整理
导读:如何单元测试自定义的ModelBinder? 这是代码。 public class MagicBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { var boundModelObject = base.BindModel(c
如何单元测试自定义的ModelBinder?

这是代码。

public class MagicBinder : DefaultModelBinder
    {

        public override object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
        {
            var boundModelObject = base.BindModel(controllerContext,bindingContext);

            var properties = bindingContext.ModelType.GetProperties().Where(a => a.CanWrite);
            foreach (var propertyInfo in properties)
            {
                object outValue = null;
                bindingContext.TryGetValue(propertyInfo.Name,propertyInfo.DeclaringType,out outValue);
                propertyInfo.SetValue(boundModelObject,outValue,null);
            }

            return boundModelObject;
        }
    }

这里是测试脚本。

[TestMethod]
public void TestFooBinding()
{
    var dict = new ValueProviderDictionary(null)
                   {
                       {"Number",new ValueProviderResult("2","2",null)},{"Test",new ValueProviderResult("12","12",};

    var bindingContext = new ModelBindingContext() { ModelName = "foo",ValueProvider = dict};

    var target = new MagicBinder();

    Foo result = (Foo)target.BindModel(null,bindingContext);
}

public class Foo
{
    public int Number { get; set; }
    public int Test { get; set; }
}

问题?在MagicBinder中,bindingContext.Model为null。如果我尝试设置它
bindingContext.Model = new Foo()。我得到一个例外,称它已被弃用,我应该设置ModelMetadata。

那么如何构建ModelMetadata?它甚至不能被嘲笑。

解决方法

尝试这样:
[TestMethod]
public void TestFooBinding()
{
    // arrange
    var formCollection = new NameValueCollection 
    {
        { "Number","2" },{ "Test","12" },};

    var valueProvider = new NameValueCollectionValueProvider(formCollection,null);
    var metadata = ModelMetadataProviders.Current.GetMetadataForType(null,typeof(Foo));
    var bindingContext = new ModelBindingContext
    {
        ModelName = "",ValueProvider = valueProvider,ModelMetadata = metadata
    };
    var controllerContext = new ControllerContext();
    var sut = new MagicBinder();

    // act    
    Foo actual = (Foo)sut.BindModel(controllerContext,bindingContext);

    // assert
    // TODO:
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读