c# - 单元测试 Mvc.Compare 属性错误地返回模型 isValid = true

标签 c# asp.net-mvc unit-testing asp.net-mvc-4

TryValidateObject 在单元测试时似乎无法使用 Compare 模型验证属性。

我得到 ModelState.IsValid = true,当我知道它是 false(单元测试时)。

我有这个示例模型:

public class CompareTestModel
{
    public string Password { get; set; }

    [System.Web.Mvc.Compare(
         "Password",
          ErrorMessage = "The passwords do not match")]
    public string PasswordCompare { get; set; }
}

在单元测试时使用这个辅助方法来验证模型:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

public static class ModelHelper
{
    public static void ValidateModel(
         this Controller controller,
         object viewModel)
    {
        controller.ModelState.Clear();

        var validationContext = new ValidationContext(viewModel, null, null);
        var validationResults = new List<ValidationResult>();

        Validator.TryValidateObject(
            viewModel,
            validationContext,
            validationResults,
            true);

        foreach (var result in validationResults)
        {
            foreach (var name in result.MemberNames)
            {
                controller.ModelState.AddModelError(name, result.ErrorMessage);
            }
        }
    }
}

然后我运行这个单元测试:

    [Test]
    public void CompareAttributeTest()
    {
        // arrange
        var model = new CompareTestModel();
        model.Password = "password";
        model.PasswordCompare = "different password";

        AccountController controller = new AccountController();

        // act
        controller.ValidateModel(model);

        // assert
        Assert.IsFalse(controller.ModelState.IsValid);
    }

最佳答案

CompareAttribute 没有填充 ValidationResult 的类 MemberNames 属性(参见 source)。所以您的 result.MemberNames 将为空。

因为不需要使用 MemberNames 属性(ValidationResult 甚至为此有一个 constructor)所以您需要更改您的 ValidateModel helper 处理这种ValidationResult:

foreach (var result in validationResults)
{
    if (result.MemberNames.Any())
    {
        foreach (var name in result.MemberNames)
        {
            controller.ModelState.AddModelError(name, result.ErrorMessage);
        }
    }
    else
        controller.ModelState.AddModelError("", result.ErrorMessage);
}

关于c# - 单元测试 Mvc.Compare 属性错误地返回模型 isValid = true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19068425/

相关文章:

C# 抽象类,用于数组初始化

asp.net-mvc - ASP.NET MVC 将非 WWW 重定向到 WWW 并重写为小写 URL

c# - File.Exists 在 UnitTest 上下文中返回 false

java - 是否可以对 JUnit 中的每个测试用例使用不同的@Before @After?

c# - decimal.TryParse 乐于接受格式错误的数字字符串

c# - node.js 与 C# 中的网络爬虫性能

c# - Windows 应用程序和 Spy++

c# - Blazor jquery select2 双向绑定(bind)

asp.net-mvc - 如何使用 MVC 将数据表绑定(bind)到 webgrid?

iphone - 对具有许多对象的核心数据进行单元测试