Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET MVC 2中对DataAnnotationsModelBinder进行单元测试_C#_Asp.net Mvc_Unit Testing_Validation - Fatal编程技术网

C# 如何在ASP.NET MVC 2中对DataAnnotationsModelBinder进行单元测试

C# 如何在ASP.NET MVC 2中对DataAnnotationsModelBinder进行单元测试,c#,asp.net-mvc,unit-testing,validation,C#,Asp.net Mvc,Unit Testing,Validation,我正在使用ASP.NET MVC 2,其中DataAnnotation属性散布在属性上,如下所示: public class LogOnViewModel { [Required] public string UserName { get; set; } [Required] public string Password { get; set; } [Required] public string Domain { get; set; } }

我正在使用ASP.NET MVC 2,其中DataAnnotation属性散布在属性上,如下所示:

public class LogOnViewModel
{
    [Required]
    public string UserName { get; set; }

    [Required]
    public string Password { get; set; }

    [Required]
    public string Domain { get; set; }
}
我有一个单元测试,在验证失败时检查当前视图是否呈现。但是,我正在手动将错误添加到
ModelState
以使其正常工作:

    [Test]
    public void TestThatLogOnActionRedirectsToLogOnViewIfValidationFails()
    {
        //create a invalid view model
        var model = new LogOnViewModel {UserName = "jsmith"};

        //Can I avoid doing this manually?
        //populate Model State Errors Collection
        _accountController.ModelState.AddModelError("FirstName", "First Name Required");
        _accountController.ModelState.AddModelError("LastName", "Last Name Required");

        var result = _accountController.LogOn(model);

        result.AssertViewRendered()
            .ForView(Constants.Views.LogOn)
            .WithViewData<LogOnViewModel>();
    }
[测试]
public void TestThatLogOnActionRedirectsToLogOnViewIfValidationFails()
{
//创建无效的视图模型
var model=newlogonviewmodel{UserName=“jsmith”};
//我可以避免手动执行此操作吗?
//填充模型状态错误集合
_accountController.ModelState.AddModelError(“名字”,“需要名字”);
_accountController.ModelState.AddModelError(“姓氏”,“需要姓氏”);
var result=\u accountController.LogOn(模型);
result.AssertViewRendered()的
.ForView(常量.Views.LogOn)
.WithViewData();
}
在单元测试中是否有直接或间接与ModelBinder交互的方法?例如:

    [Test]
    public void TestThatLogOnActionRedirectsToLogOnViewIfValidationFails()
    {
        //create a invalid view model
        var model = new LogOnViewModel {UserName = "jsmith"};

        //validate model
        //not sure about the api call...
        var validationResults = new DataAnnotationsModelBinder().Validate(model);

        _accountController.ModelState.Merge(validationResults);
        var result = _accountController.LogOn(model);

        result.AssertViewRendered()
            .ForView(Constants.Views.LogOn)
            .WithViewData<LogOnViewModel>();
    }
[测试]
public void TestThatLogOnActionRedirectsToLogOnViewIfValidationFails()
{
//创建无效的视图模型
var model=newlogonviewmodel{UserName=“jsmith”};
//验证模型
//不确定api调用。。。
var validationResults=new DataAnnotationsModelBinder().Validate(model);
_accountController.ModelState.Merge(validationResults);
var result=\u accountController.LogOn(模型);
result.AssertViewRendered()的
.ForView(常量.Views.LogOn)
.WithViewData();
}

Brad Wilson有一篇关于DataAnnotationsModelBinder的不错的博客,包括如何对其进行单元测试:

我通常通过直接调用System.ComponentModel.DataAnnotations.Validator的facade方法对我的模型验证设置进行单元测试

我就这个问题写了一篇文章

我最终得到了这样的代码(本文展示了一个用于模型验证的更干净、可重用的单元测试基类)

[测试]
[TestCaseSource(“ValidationRule_Source”)]
公共无效验证规则(ValidateRuleSpec规范){
//安排
var model=CreateValidPersonModel();
//应用坏值
model.GetType().GetProperty(spec.MemberName).SetValue(model,spec.BadValue);
//表演
var validationResults=新列表();
var success=Validator.TryValidateObject(模型,新的ValidationContext(模型),validationResults,true);
//断言
期望(成功,错误);
Expect(validationResults.Count,等式(1));
Expect(validationResults.SingleOrDefault(r=>r.MemberNames.Contains(spec.MemberName)),Not.Null);
}
public IEnumerable ValidationRule_Source(){
收益率返回新ValidateRuleSpec(){
BadValue=null,
MemberName=“FirstName”
};
收益率返回新ValidateRuleSpec(){
BadValue=string.Empty,
MemberName=“FirstName”
};
收益率返回新ValidateRuleSpec(){
BadValue=null,
MemberName=“LastName”
};
/* ... */
}
我不喜欢只相信代码工作,所以我系统地为我的模型验证代码编写单元测试。但是,我相信框架/模型绑定器可以执行验证。
通过这个单元测试,我可以编写信任验证的控制器。

嗨,Dave,我在盯着主题看之后发现了这篇文章,我对他关于“只信任”DataAnnotationsModelBinder的回答不满意,所以我决定在这里发布一个问题。无论如何谢谢你
[Test]
[TestCaseSource("ValidationRule_Source")]
public void ValidationRule(ValidateRuleSpec spec) {
    // Arrange
    var model = CreateValidPersonModel();
    // Apply bad valud
    model.GetType().GetProperty(spec.MemberName).SetValue(model, spec.BadValue);

    // Act
    var validationResults = new List<ValidationResult>();
    var success = Validator.TryValidateObject(model, new ValidationContext(model), validationResults, true);

    // Assert
    Expect(success, False);
    Expect(validationResults.Count, EqualTo(1));
    Expect(validationResults.SingleOrDefault(r => r.MemberNames.Contains(spec.MemberName)), Not.Null);
}

public IEnumerable<ValidateRuleSpec> ValidationRule_Source() {
    yield return new ValidateRuleSpec() {
        BadValue = null,
        MemberName = "FirstName"
    };
    yield return new ValidateRuleSpec() {
        BadValue = string.Empty,
        MemberName = "FirstName"
    };
    yield return new ValidateRuleSpec() {
        BadValue = null,
        MemberName = "LastName"
    };
    /* ... */
}