EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:测试验证规则

eXpressApp框架供给了十几各种验证规则类型。这些验证规则具有不同的属性,并且经常可能会犯错,例如,通过会改变规则行为的错字。为确保验证规则的行为符合预期,建议您实施自动测试。您可以通过单元测试和功能测试在XAF中测试验证规则。本主题演示了如何使用NUnit单元测试和EasyTest功能测试框架来实现此类测试。

注意

移动应用程序不支持EasyTest功能测试。

提示

可在http://www.devexpress.com/example=E2473的DevExpress代码示例数据库中找到完整的示例项目。

要查看初学者的分步测试说明,请参阅“如何:测试操作”主题。

单元测试

假设您有一个IEmployee 域组件,该组件声明了NameAge属性。每个IEmployee对象都必须具有一个非空的Name。这可以通过将RuleRequiredFieldAttribute属性应用于Name属性来实现。该年龄值必须是18或长辈。因此,Age属性由RuleValueComparisonAttribute装饰属性。以下代码段对此进行了说明。请注意,建议您通过其他字符串常量指定规则标识符。这消除了在测试中错误键入标识符的可能性。

using DevExpress.ExpressApp.DC;
using DevExpress.Persistent.Base;
//...
[DomainComponent, DefaultClassOptions, ImageName("BO_Employee")]
public interface IEmployee {
    [RuleRequiredField(EmployeeValidationRules.EmployeeNameIsRequired, DefaultContexts.Save)]
    string Name { get; set; }
    [RuleValueComparison(EmployeeValidationRules.EmployeeIsAdult, DefaultContexts.Save, 
        ValueComparisonType.GreaterThanOrEqual, 18)]
    int Age { get; set;}
}
public class EmployeeValidationRules {
    public const string EmployeeNameIsRequired = "EmployeeNameIsRequired";
    public const string EmployeeIsAdult = "EmployeeIsAdult";
}

以下代码段说明了已实现的EmployeeNameIsRequiredEmployeeIsAdult规则的单元测试。由于我们正在测试域组件而不是常规的业务类,因此我们将需要执行其他初始化。在运行测试之前由NUnit调用的SetUp方法中,通过ITypesInfo.RegisterEntity方法注册IEmployee接口,然后调用ITypesInfo.GenerateEntities方法。对于常规的商务舱,这不是必需的。

using NUnit.Framework;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Xpo;
using DevExpress.Persistent.Validation;
//...
[TestFixture]
public class EmployeeValidationTests {
    private IObjectSpace objectSpace;
    [SetUp]
    public virtual void SetUp() {
        objectSpace = new XPObjectSpaceProvider(new MemoryDataStoreProvider()).CreateObjectSpace();
        XafTypesInfo.Instance.RegisterEntity("Employee", typeof(IEmployee));
        XafTypesInfo.Instance.GenerateEntities();
    }
    [Test]
    public void EmployeeIsValid() {
        IEmployee employee = objectSpace.CreateObject<IEmployee>();
        RuleSet ruleSet = new RuleSet();
        RuleSetValidationResult result;

        result = ruleSet.ValidateTarget(objectSpace, employee, DefaultContexts.Save);
        Assert.AreEqual(ValidationState.Invalid,
            result.GetResultItem(EmployeeValidationRules.EmployeeNameIsRequired).State);

        employee.Name = "Mary Tellitson";
        result = ruleSet.ValidateTarget(objectSpace, employee, DefaultContexts.Save);
        Assert.AreEqual(ValidationState.Valid,
            result.GetResultItem(EmployeeValidationRules.EmployeeNameIsRequired).State);

        employee.Age = 17;
        result = ruleSet.ValidateTarget(objectSpace, employee, DefaultContexts.Save);
        Assert.AreEqual(ValidationState.Invalid,
            result.GetResultItem(EmployeeValidationRules.EmployeeIsAdult).State);

        employee.Age = 18;
        result = ruleSet.ValidateTarget(objectSpace, employee, DefaultContexts.Save);
        Assert.AreEqual(ValidationState.Valid,
            result.GetResultItem(EmployeeValidationRules.EmployeeIsAdult).State);
    }
}

测试验证规则时,有几点要注意。

  • 您可能会意外配置一个始终失败的规则,而不是仅在必要时失败。因此,请始终在有效和无效的情况下测试验证规则的行为。
  • 您可以不由自主地创建会相互影响的测试。为确保不会发生这种情况,请始终对每个测试使用新的RuleSet
  • 通过CodeRuleAttribute实现的代码规则不会自动收集。因此,要测试这样的规则,您需要手动实例化它,并将实例添加到RuleSet.RegisteredRules对象。

功能测试

CheckValidationResult命令

让我们通过EasyTest功能测试框架测试Employee对象的验证规则。在Windows窗体应用程序中,当发生验证错误时,将显示弹出窗口。在ASP.NET应用程序中,使用ErrorInfoControl将验证结果显示在当前页面上(请参阅“ ASP.NET和移动应用程序中的错误处理”主题的当前页上的错误消息(ErrorInfoControl)部分)。要在一个测试脚本中测试两个平台,可以使用CheckValidationResult EasyTest命令。下图说明了两个平台中命令参数的含义。

EasyTest_CheckValidationResult

要测试Employee对象的验证规则,可以使用以下EasyTest脚本。

#Application TestValidationWin
#Application TestValidationWeb

;Create a new Employee:
*Action New(Employee)

;Save it with initial property values (empty Name and zero Age):
*Action Save

;Test the validation result that is displayed when saving:
*CheckValidationResult
 Message = Problems were detected during data validation. *
 Info = "Name" must not be empty.
 Info = "Age" must be greater than or equal to "18".

;Close the error message:
*OptionalAction Close

;Specify a valid Name and invalid Age:
*FillForm
 Name = Mary Tellitson
 Age = 17

;Save an Employee with invalid Age:
*Action Save

;Test the validation result that is displayed when saving:
*CheckValidationResult
 Message = Problems were detected during data validation. *
 Info = "Age" must be greater than or equal to "18".

;Close the error message:
*OptionalAction Close

;Specify a valid Age:
*FillForm
 Age = 18

;Save a valid Employee:
*Action Save

;Check that an error is not displayed:
!CheckValidationResult
 Message = ?*

请注意OptionalAction命令的使用。它会关闭Windows窗体应用程序中的验证结果窗口。此活动是可选的,因为ASP.NET应用程序在当前页面上显示错误,并且没有“关闭”按钮。

HandleDialog命令

重要的是要记住,只有包含ValidationWindowsFormsModule模块时,才可以将CheckValidationResult命令用于测试Windows Forms应用程序。如果出于任何原因删除了此模块,则验证错误将像其他任何错误一样显示在消息框中。

EasyTest_HandleDialig

在这种情况下,您应该使用HandleDialog EasyTest命令而不是CheckValidationResult。因此,以上脚本应按以下方式重写。

#Application TestValidationWinNoWindowsFormsValidationModule
#Application TestValidationWeb

;Create a new Employee:
*Action New(Employee)

;Save it with initial property values (empty Name and zero Age):
*Action Save

;Test the error message that is displayed when saving:
*HandleDialog
 Message[0] = Problems were detected during data validation. *
 Message[1] = - "Age" must be greater than or equal to "18".
 Message[2] = - "Name" must not be empty.

;Close the error message:
*OptionalAction OK

;Specify a valid Name and invalid Age:
*FillForm
 Name = Mary Tellitson
 Age = 17

;Save an Employee with invalid Age:
*Action Save

;Test the error message that is displayed when saving:
*HandleDialog
 Message[0] = Problems were detected during data validation. *
 Message[1] = Mary Tellitson
 Message[2] = - "Age" must be greater than or equal to "18".

;Close the error message:
*OptionalAction OK

;Specify a valid Age:
*FillForm
 Age = 18

;Save a valid Employee:
*Action Save

;Check that an error is not displayed:
!HandleDialog
 Message = ?*

请注意OptionalAction命令的使用。它将关闭Windows窗体应用程序中的错误消息。此活动是可选的,因为ASP.NET应用程序在当前页面上显示错误,并且没有“确定”按钮。

您可能要使用HandleDialog命令来测试验证,但不想在“调试”或“发布”配置中禁用ValidationWindowsFormsModule模块。解决方案是在实例化WinApplication后代之后,将以下代码添加到Windows Forms应用程序的Main方法中。

static void Main() {
    // ...
    TestValidationWindowsFormsApplication winApplication = 
        new TestValidationWindowsFormsApplication();
#if EASYTEST
            winApplication.Modules.Remove(
                winApplication.Modules.FindModule(typeof(
                DevExpress.ExpressApp.Validation.Win.ValidationWindowsFormsModule)));
#endif
    // ...
}

有了这个代码,该ValidationWindowsFormsModule将在运行时EASYTEST被禁用。

注意

当您的测试仅用于ASP.NET应用程序时,可以使用您选择的命令(CheckValidationResultHandleDialog)。在这种情况下,我们建议使用HandleDialog命令,因为它的语法更简单。

相关文章

转载保留此链接,注明出处