测试模型验证而不测试实现

时间:2011-02-28 11:14:17

标签: asp.net-mvc unit-testing validation

在不对验证的实现细节进行假设的情况下,测试模型验证的最佳方法是什么(例如,DataAnnotations)。

例如,如果我有一个Customer模型对象具有Firstname属性,我想测试那个绑定Firstname的缺失值属性将导致验证错误,但我不想测试如何验证他的实现。也就是说,我不想使用DataAnotations.Validate

我已经看到了几个不同的意见,并且没有找到一个我同意的意见。

2 个答案:

答案 0 :(得分:1)

我最终编写了一个包装ModelValidator并返回IEnumerable<ModelValidationResult>的辅助方法。它要求使用您选择的验证提供程序配置MVC,但这意味着在验证实现时,测试代码无需更改:

public static IEnumerable<ModelValidationResult> Validate<TModel>(TModel model)
{
    var modelMetadata = ModelMetadata.FromLambdaExpression(r => r,
        new ViewDataDictionary<TModel>(model));

    ModelValidator validator = ModelValidator.GetModelValidator(
        modelMetadata, new ControllerContext());

    return validator.Validate(model);
}

答案 1 :(得分:0)

这取决于您用于验证模型的框架。所以如果不考虑这一点,你所要求的是不可能的。默认情况下,ASP.NET MVC使用数据注释模型提供程序来调用数据注释的验证规则,如果要对其进行测试,则需要在单元测试中执行DataAnnotations.Validate或验证模型是否使用适当的属性。

我个人使用FluentValidation.NETunit testing my validators提供了一种优雅的方式,所以这不是一件容易的事。