Asp.net mvc 使用ASP MVC进行单元测试:Validator.TryValidateObject始终返回true

Asp.net mvc 使用ASP MVC进行单元测试:Validator.TryValidateObject始终返回true,asp.net-mvc,unit-testing,validation,Asp.net Mvc,Unit Testing,Validation,我正在尝试使用Validator.TryValidateObject验证MVC模型。 这在生产模式下有效,但在unittest代码中无效。 Validator.TryValidateObject给我一个alwasy true 守则包括以下部分: 在控制器构造函数中,我注入模型: private IEmailModel model; public JoggenController(IEmailModel m) { this.model = m; } 在action meth

我正在尝试使用Validator.TryValidateObject验证MVC模型。 这在生产模式下有效,但在unittest代码中无效。 Validator.TryValidateObject给我一个alwasy true

守则包括以下部分:

在控制器构造函数中,我注入模型:

private IEmailModel model;  
public JoggenController(IEmailModel m)  
{  
 this.model = m;  
}  
在action methode中,我验证模型,在生产模式下工作正常,isValid为true或false:

public ViewResult AddEmail(String email)  
{  
model.Email = email;  
var context = new ValidationContext(model, null, null);  
var list = new List<ValidationResult>();   
var isValid = Validator.TryValidateObject(model, context, list, true);              
 //...
var emailModel = new Mock<IEmailModel>();  
emailModel  
     .Setup(p => p.Email)  
     .Returns("xxx");  

var controller = new Controller(emailModel.Object);  

//should Faking ModelState.IsValid = false             
controller.ModelState.Add("testError", new ModelState());  
controller.ModelState.AddModelError("testError", "test");  

var result = controller.AddEmail("xxx") as ViewResult;      
//...  
现在,我将测试AddEmail并使用以下测试代码:

public ViewResult AddEmail(String email)  
{  
model.Email = email;  
var context = new ValidationContext(model, null, null);  
var list = new List<ValidationResult>();   
var isValid = Validator.TryValidateObject(model, context, list, true);              
 //...
var emailModel = new Mock<IEmailModel>();  
emailModel  
     .Setup(p => p.Email)  
     .Returns("xxx");  

var controller = new Controller(emailModel.Object);  

//should Faking ModelState.IsValid = false             
controller.ModelState.Add("testError", new ModelState());  
controller.ModelState.AddModelError("testError", "test");  

var result = controller.AddEmail("xxx") as ViewResult;      
//...  
如果调试测试代码,var isValid=Validator.TryValidateObject将始终返回true。 有什么问题吗


谢谢

为什么要将模型作为构造函数参数传递给控制器?更好的方法是让控制器操作直接将模型作为操作参数,并让模型绑定器执行此操作,而不是在操作中手动编写管道验证代码。我这样做是因为我可以为控制器提供模型的模拟对象。所以我可以控制使用的模型类。这就是我的意图。您可以将一个存储库传递给控制器构造函数,该构造函数可以被模拟,然后将普通POCO用于视图模型。