MVP中的服务器端验证和单元测试

时间:2014-04-06 01:30:40

标签: c# asp.net validation unit-testing mvp

我们遵循被动控制器方法,当用户点击提交时,会触发服务器端验证。屏幕上还有许多其他字段需要验证。

我想获得有关以下方法的反馈。

  1. 在Presenter中进行验证是否可以。
  2. 由于UI中有许多字段,PerformServerValidations()方法变得越来越大。有什么方法可以重构它。
  3. PerformServerValidations()声明为公共并返回IList后的意图是能够对其进行测试。这是一个很好的方法吗?

    [TestMethod]
    public void Presenter_PerformServerValidations_ValidateFromCustomerId_ExpectFalseForInvalidNumber()
    {
        //creating presenter
        presenter.View.Stub(x=>x.FromCustomerId).Return("one two three");    
    
        var errorCodes = presenter.PerformServerValidations();
    
        Assert.IsTrue(errorCodes.Contains("ERR_InvalidFromCustomerId"));
    }
    
  4. Presenter.cs

    public void OnSubmit()
    {
        var serverValidationErrors = PerformServerValidations();
        // View.ServerErrors will loop over the list and sets validator's IsValid property to false
        this.View.ServerErrors = serverValidationErrors ; 
        if(!serverValidationErrors.Any())
        {
             BindCustomers();
        }
    }
    
    public IList<string> PerformServerValidations()
    {
       var errorCodes = new List<string>();
    
       int parsedFromCustomerId;
       int parsedToCustomerId;
    
       bool isValidFromCustomerId = int.TryParse(this.View.FromCustomerId, out 
    parsedFromCustomerId);
       bool isValidToCustomerId = int.TryParse(this.View.ToCustomerId, out parsedToCustomerId);
    
       if(!string.IsNullOrWhiteSpace(this.View.FromCustomerId) && !isValidFromCustomerId)
       { 
           errorCodes.Add("ERR_InvalidFromCustomerId");
       }
    
       if(!string.IsNullOrWhiteSpace(this.View.ToCustomerId) && !isValidToCustomerId)
       { 
           errorCodes.Add("ERR_InvalidToCustomerId");
       }
    
       if((!string.IsNullOrWhiteSpace(this.View.FromCustomerId) && !string.IsNullOrWhiteSpace(this.View.FromCustomerId) && (isValidFromCustomerId && isValidToCustomerId))
       { 
           if(parsedFromCustomerId > parsedToCustomerId)
           {
               errorCodes.Add("ERR_InvalidCustomerIdRange");
           }
       }
    
       //There are many other fields to be validated
       return errorCodes;
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 是的,可以在演示者上验证。您还可以在客户端验证一些简单的东西(如拼写错误等)。
  2. 如果您认为验证方法过长或者演示者之间重复过多,您可以创建验证器对象,这些对象将接收有关您要验证用户输入的表单/视图的信息。
  3. 我没有看到这么多问题。如果您的验证非常复杂,需要进行单元测试,我肯定会将它们从演示者中移到一个或多个验证类中。
  4. 也许您应该查看人们在这里说的话:.Net object validation frameworks