gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:39:22 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com