【问题标题】:Testing Model binding in ASP.NET MVC 2在 ASP.NET MVC 2 中测试模型绑定
【发布时间】:2010-12-20 02:48:43
【问题描述】:

首先;我知道我不需要测试 MVC 的内部,但我真的需要一个套件来测试流入我们系统的数据。

我希望在不模拟所有 HTTP 上下文的情况下如何测试 objectA(表单集合、字典、集合、对象等)是否符合 objectAModel?

我不想实例化我的控制器或调用操作。我只是想测试我的新对象是否使模型状态无效。

我希望我能简单地写

var modelState = new ModelBindingContext<objectAModel>().validate(objectA);

【问题讨论】:

  • 然后我就可以进行如下测试:Assert.isTrue(new ModelBindingContext().validate(objectA));

标签: asp.net-mvc unit-testing modelbinders modelstate defaultmodelbinder


【解决方案1】:

布拉德威尔逊有一个excellent post on DataAnnotations


我如何测试它?

使用 DataAnnotations 属性 为您的模型移动验证 退出控制器动作并进入 模型活页夹,这意味着您的 控制器操作的单元测试 将被简化。

当您为此编写测试时, 您需要验证三件事:

  1. DataAnnotationsModelBinder 是否已注册 作为默认活页夹? 您只需为整个应用程序执行一次,就像路由一样 你会写的测试。
  2. 我的模型是否使用 DataAnnotations 属性正确修饰? 您最终将为您添加的每个验证属性编写测试 到您的模型。
  3. 当模型状态无效时,我的操作方法是否正确响应? 您只需为每个操作方法编写一次。

【讨论】:

  • 这只会测试模型是否装饰有正确的属性。
【解决方案2】:

非常简单,您可以实现一个方法,为您的模型类型提取ModelMetadata,获取ModelValidator,并验证模型对象。

public bool IsModelValid<T>(T model) where T : class
{
    var metaData = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(T));
    var validator = ModelValidator.GetModelValidator(metaData, new ControllerContext());
    var validationResults = validator.Validate(model);
    return 0 == validationResults.Count();
}

“简单地”是指这不一定会考虑所有可能的配置,但您可以对模型的有效性进行基本检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多