EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:测试条件外观(Condition Appearance)规则

条件外观规则可能非常复杂。通常可能会犯错,例如,使用会改变规则行为的错字。为确保您的“条件外观”规则表现出预期效果,建议您实施自动测试。您可以通过功能测试和单元测试在XAF中测试条件外观规则。本主题演示了如何使用EasyTest功能测试和NUnit单元测试框架来实现此类测试。

注意

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

提示

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

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

功能测试

假设您拥有MyPerson持久对象,该对象公开了NameIsMarriedSpouseName属性。要求是当IsMarried为false时,禁用SpouseName属性的编辑器。这可以通过将AppearanceAttribute应用于SpouseName属性来实现。以下代码段和图像对此进行了说明。

using DevExpress.ExpressApp.Model;
using DevExpress.ExpressApp.ConditionalAppearance;
// ...
[DefaultClassOptions, ImageName("BO_Person"), ModelDefault("Caption", "Person")]
public class MyPerson : BaseObject {
    public MyPerson(Session session) : base(session) { }
    private string name;
    public string Name {
        get { return name; }
        set { SetPropertyValue(nameof(Name), ref name, value); }
    }
    private bool isMarried;
    [ImmediatePostData]
    public bool IsMarried {
        get { return isMarried; }
        set { 
            SetPropertyValue(nameof(IsMarried), ref isMarried, value);
            if (!String.IsNullOrEmpty(SpouseName) && !value) SpouseName = String.Empty;
        }
    }
    private string spouseName;
    [Appearance("DisableSpouseName", Criteria="!IsMarried", Enabled=false)]
    public string SpouseName {
        get { return spouseName; }
        set { SetPropertyValue(nameof(SpouseName), ref spouseName, value); }
    }
}

测试条件外观规则

注意

此条件外观规则非常简单,当然,无需在实际应用程序中测试此类规则。但是,出于学习目的,我们将在此处对其进行测试。建议测试具有复杂标准或相互干扰的规则(请参阅AppearanceAttribute.Priority)。

要测试MyPerson对象的条件外观规则,可以使用以下EasyTest脚本。

#Application TestConditionalAppearanceRulesWin
#Application TestConditionalAppearanceRulesWeb

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

;Set IsMarried to true
*FillForm
 Name = Jane Smith
 Is Married = true

;Test that the SpouseName field is editable
*FillForm
 Spouse Name = John Smith

;Set IsMarried to false
*FillForm
 Is Married = false

;Test that the SpouseName field is not editable
!FillForm
 Spouse Name = John Smith

您可能不小心将条件外观规则配置为始终禁用编辑器,而不是仅在必要时禁用它。因此,当规则的标准有效和无效时,请始终测试规则在不同情况下的行为。

注意

当前,您只能使用EasyTest测试可见性和启用/禁用状态。要了解如何测试字体颜色或样式,请进入“单元测试”部分。

单元测试

检查外观目标是启用还是禁用

让我们测试使用NUnit在本主题的第一部分中定义的DisableSpouseName规则。要实施这样的测试,我们必须清楚如何收集和应用“条件外观”规则。代码中定义的规则由AppearanceRulesModelNodesGenerator节点生成器收集。此生成器创建BOModel |的子节点。<类别> | 应用程序模型中的AppearanceRules节点。在条件外观模块中定义的AppearanceController视图控制器从应用程序模型收集外观规则,并提供RefreshItemAppearance 方法,可以刷新支持该方法的对象的外观。该控制器会影响支持以下一个或多个接口的对象的外观。

以下代码说明了可以处于启用或禁用状态并可以重置为默认状态的伪造对象的实现。我们将在测试中使用该对象。

using DevExpress.ExpressApp.Editors;
// ...
public class FakeAppearanceTarget : IAppearanceEnabled {
    #region IAppearanceEnabled Members
    private bool enabled;
    public bool Enabled { 
        get { return enabled; } 
        set { enabled = value; } 
    }
    public void ResetEnabled() {
            Enabled = true;
    }
    #endregion
}

在测试中,将需要XafApplication实例。由于此类是抽象的,因此我们无法直接实例化它。因此,让我们实现以下简单的后代。

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Layout;
// ...
class TestApplication : XafApplication {
    protected override LayoutManager CreateLayoutManagerCore(bool simple) {
        return null;
    }
}

现在,我们可以按以下方式实施测试。

using NUnit.Framework;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Xpo;
using DevExpress.ExpressApp.ConditionalAppearance;
// ...
[TestFixture]
public class PersonConditionalAppearanceTests {
    private MyPerson person;
    private FakeAppearanceTarget target;
    private AppearanceController controller;
    private DetailView detailView;
    [SetUp]
    public void SetUp() {
        XPObjectSpaceProvider objectSpaceProvider = 
            new XPObjectSpaceProvider(new MemoryDataStoreProvider());
        TestApplication application = new TestApplication();
        ModuleBase testModule = new ModuleBase();
        testModule.AdditionalExportedTypes.Add(typeof(MyPerson));
        application.Modules.Add(testModule);
        application.Modules.Add(new ConditionalAppearanceModule());
        application.Setup("TestApplication", objectSpaceProvider);
        IObjectSpace objectSpace = objectSpaceProvider.CreateObjectSpace();
        person = objectSpace.CreateObject<MyPerson>();
        target = new FakeAppearanceTarget();
        controller = new AppearanceController();
        detailView = application.CreateDetailView(objectSpace, person);
        controller.SetView(detailView);
    }
    [Test]
    public void TestSpouseNameVisibility() {
        person.IsMarried = true;
        controller.RefreshItemAppearance(detailView, "ViewItem", "SpouseName", target, person);
        Assert.IsTrue(target.Enabled);
        person.IsMarried = false;
        controller.RefreshItemAppearance(detailView, "ViewItem", "SpouseName", target, person);
        Assert.IsFalse(target.Enabled);
    }
}

在这里,TestConditionalAppearanceRulesModule是一个包含MyPerson对象的模块。

注意

如果通过XafApplication.CreateDetailView方法创建的详细信息视图包含嵌套的列表视图,或者您想在测试中使用XafApplication.CreateListView方法,则TestApplication类应实现CreateListEditorCore方法。否则,测试时将引发“无法为视图创建ListEditor:ListViewId ”异常。请参阅“如何:测试操作”主题以查看示例。

检查字体颜色

让我们将以下外观规则添加到MyPerson类。

[Appearance("NameFontIsRed", Criteria="IsMarried", FontColor="Red")]
[Appearance("NameFontIsGreen", Criteria="!IsMarried", FontColor = "Green")]
public string Name {
    // ...
}

TestConditionalAppearanceRules2

NameFontIsRedNameFontIsGreen规则改变名称取决于标准属性的字体颜色。

注意

应当再次指出,使用的标准非常简单,无需在实际应用中对其进行测试。但是,我们将在这里进行测试,只是为了演示这个概念。

要测试字体颜色,必须扩展FakeAppearanceTarget类。确保在其中支持IAppearanceFormat接口。

public class FakeAppearanceTarget : 
    IAppearanceFormat, IAppearanceEnabled {
    #region IAppearanceFormat Members
    private Color backColor;
    public Color BackColor { 
        get { return backColor; } 
        set { backColor = value; } 
    }
    private Color fontColor;
    public Color FontColor { 
        get { return fontColor; } 
        set { fontColor = value; } 
    }
    private FontStyle fontstyle;
    public FontStyle FontStyle { 
        get { return FontStyle; }
        set { fontstyle = value; } 
    }
    public void ResetFontStyle() {
        FontStyle = FontStyle.Regular;
    }
    public void ResetFontColor() {
        FontColor = new Color();
    }
    public void ResetBackColor() {
        FontColor = new Color();
    }
    #endregion
    // ...
}

现在,可以按照以下方式测试NameFontIsRedNameFontIsGreen规则。

using System.Drawing;
// ...
[TestFixture]
public class PersonConditionalAppearanceTests {
    // ...
    [Test]
    public void TestNameFontColor() {
        person.IsMarried = true;
        controller.RefreshItemAppearance(detailView, "ViewItem", "Name", target, person);
        Assert.AreEqual(Color.Red, target.FontColor);
        person.IsMarried = false;
        controller.RefreshItemAppearance(detailView, "ViewItem", "Name", target, person);
        Assert.AreEqual(Color.Green, target.FontColor);
    }
}

检查外观目标可见性

要检查影响项目可见性的规则,请使用与上面用于测试启用/禁用状态相同的方法。区别在于,你应该支持IAppearanceVisibility接口在FakeAppearanceItem类,设置了FakeAppearanceItem.Visibility属性ViewItemVisibility.ShowFakeAppearanceItem.ResetVisibility方法和测试FakeAppearanceItem.Visibility值。

相关文章

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