Rob*_*obs 5 c# asp.net-mvc unit-testing asp.net-mvc-4
TryValidateObjectCompare在单元测试时,似乎没有使用模型验证属性.
我知道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; }
}
Run Code Online (Sandbox Code Playgroud)
在单元测试时使用此辅助方法验证模型:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我运行这个单元测试:
[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);
}
Run Code Online (Sandbox Code Playgroud)
不CompareAttribute填写 的ValidationResult类MemberNames属性(参见源代码)。所以你的意志result.MemberNames是空的。
因为不需要使用该MemberNames属性(ValidationResult甚至有一个构造函数),所以您需要更改您的ValidateModel助手来处理这种类型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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |