EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:测试操作

本主题提供有关如何测试XAF应用程序的分步说明。在此示例中,实现了提供推迟动作的自定义控制器。然后,将通过EasyTest功能测试和NUnit单元测试框架来测试该Action的功能。

EasyTest_HowToPostponeController

注意

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

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E1619)中提供了完整的示例项目。

实施自定义操作

创建一个名为PostponeControllerTest的新XAF应用程序解决方案。定制控制器将对“任务”业务对象执行“操作” 。样本任务的业务类公开两个属性-说明和交货期。

[DefaultClassOptions]
public class Task : BaseObject {
    public Task(Session session) : base(session) { }
    public string Description {
        get { return GetPropertyValue<string>(nameof(Description)); }
        set { SetPropertyValue<string>(nameof(Description), value); }
    }
    public DateTime DueDate {
        get { return GetPropertyValue<DateTime>(nameof(DueDate)); }
        set { SetPropertyValue<DateTime>(nameof(DueDate), value); }
    }
}

定制控制器的目标是列表视图,并且包含“延迟动作”。该操作处理任务列表视图中的选定对象。该操作将一天添加到对象的DueDate属性值。

public class PostponeController : ViewController {
    private SimpleAction postpone;
    public PostponeController() {
        TargetObjectType = typeof(Task);
        postpone = new SimpleAction(this, "Postpone", "Edit");
        postpone.Execute  = Postpone_Execute;
    }
    void Postpone_Execute(object sender, SimpleActionExecuteEventArgs e) {
        foreach (object selectedObject in View.SelectedObjects) {                              
            Task selectedTask = (Task)selectedObject;                    
            if (selectedTask.DueDate == DateTime.MinValue) {
                selectedTask.DueDate = DateTime.Today;
            }
            selectedTask.DueDate = selectedTask.DueDate.AddDays(1);               
        }
    }
    public SimpleAction Postpone {
        get { return postpone; }
    }
}

功能测试

本节介绍了一种创建EasyTest脚本的方法,该脚本可确保已实施的Postpone Action按预期方式工作。该测试将适用于Windows窗体和ASP.NET Web应用程序。

  1. 解决方案资源管理器中,导航到模块项目。右键单击FunctionalTests文件夹,然后选择添加|。新项目

    EasyTest_HowToPostponeController2

    在“添加新项”对话框中,选择“文本文件”,然后输入“ PostponeControllerTest.ets”作为新文件的名称。调用Visual Studio文本编辑器时,输入以下代码。

    #DropDB PostponeControllerTestEasyTest
    
    #Application PostponeControllerTest.Win
    #Application PostponeControllerTest.Web
    
    *Action New(Task)
    
    *FillForm
     Description = Test Task One
     Due Date = 06/06/2011
    
    *Action Save and New
    
    *FillForm
     Description = Test Task Two
     Due Date = 07/07/2011
    
    *Action Save and Close
    
    *Action Navigation(Task)
    
    *SelectRecords
     Columns = Description
     Row = Test Task One
     Row = Test Task Two
    
    *Action Postpone
    
    *CheckTable
     Columns = 'Due Date'
     Row = 6/7/2011
     Row = 7/8/2011
    

    该脚本创建两个Task对象,在“列表视图”中选择它们并执行“推迟动作”。之后,脚本确保测试对象的DueDate属性值按预期更改。有关EasyTest命令语法的详细信息,请参阅EasyTest脚本参考主题。

    注意

    默认情况下,FunctionalTests文件夹包含Sample.ets脚本。您可以将其用作创建测试的起点。如果不需要此文件,则可以将其删除。最初位于FunctionalTests文件夹中的另一个文件是Config.xml。该文件指定 EasyTest配置设置,不应删除。

  2. 保存测试脚本。在解决方案资源管理器中右键单击此文件,然后选择“运行”

    EasyTest_HowToPostponeController3

    该测试将首先在Windows窗体中执行,然后在ASP.NET应用程序中执行(这由测试脚本的第二个和第三个命令指定)。然后,您将看到以下输出,指示所有测试已成功通过。

    EasyTest_HowToPostponeController4

单元测试

本节介绍了一种创建单元测试的方法,该方法可确保已实施的“推迟操作”按预期工作。

  1. 在模块项目中,添加对nunit.framework程序集的引用。
  2. 实现以下简单的TestApplication类,因为上述测试需要它。

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

    我们不能实例化XafApplication类本身,因为它是抽象的。因此,我们创建了一个轻量级后代。可以使用内置的XafApplication后代(例如WinApplication),但在这种情况下不建议使用,因为测试将花费更多的时间开始。

  3. 将以下测试类添加到模块项目中。

    using NUnit.Framework;
    using DevExpress.ExpressApp;
    using DevExpress.ExpressApp.Xpo;
    
    // ...
    [TestFixture]
    public class PostponeControllerUnitTest {
        IObjectSpace objectSpace;
        PostponeController controller;
        TestApplication application;
        [SetUp]
        public void SetUp() {
            XPObjectSpaceProvider objectSpaceProvider = 
                new XPObjectSpaceProvider(new MemoryDataStoreProvider());
            application = new TestApplication();
            ModuleBase testModule = new ModuleBase();
            testModule.AdditionalExportedTypes.Add(typeof(Task));
            application.Modules.Add(testModule);
            application.Setup("TestApplication", objectSpaceProvider);
            objectSpace = objectSpaceProvider.CreateObjectSpace();
            controller = new PostponeController();
        }
        [Test]
        public void TestPostponeActionDueDateUnspecified() {
            Task task = objectSpace.CreateObject<Task>();
            controller.SetView(application.CreateDetailView(objectSpace, task));
            controller.Postpone.DoExecute();
            Assert.AreEqual(task.DueDate, DateTime.Today.AddDays(1));
        }
        [Test]
        public void TestPostponeActionDueDateSpecified() {
            Task task = objectSpace.CreateObject<Task>();
            task.DueDate = new DateTime(2011, 6, 6);
            controller.SetView(application.CreateDetailView(objectSpace, task));
            controller.Postpone.DoExecute();
            Assert.AreEqual(task.DueDate, new DateTime(2011, 6, 7));
        }
    }
    

    在此测试中,我们实例化了一个应用程序和ObjectSpaceProvider。然后,注册所需的模块和业务对象。之后,可以创建要测试的Controller并为其设置View。要在测试中执行Action,请使用SimpleAction.DoExecute方法。请注意,延迟动作是由Controller的公共属性公开的,以允许从外部访问该动作。

    注意

    您可以将测试装置代码包含在#ifdef DEBUG#endif语句中,以将测试从应用程序的发行版中排除。

  4. 生成模块项目,然后在NUnit GUI运行器nunit.exe)中打开输出程序集。然后,单击运行以查看结果。

    NUnit_TestAction

如果要测试列表视图或包含嵌套列表视图的详细信息视图中可用的操作,则需要一个TestApplication类,该类实现CreateListEditorCore虚拟方法。原因是当执行XafApplication.CreateListView方法时,实例化了列表编辑器。由于XAF中没有内置的与平台无关的列表编辑器,因此应出于测试目的而实现伪造的列表编辑器,并在重写的CreateListEditorCore方法中返回此列表编辑器的实例。

using DevExpress.ExpressApp.Layout;
using DevExpress.ExpressApp.Editors;
// ...
class TestApplication : XafApplication {
    protected override LayoutManager CreateLayoutManagerCore(bool simple) {
        return null;
    }
    protected override ListEditor CreateListEditorCore(
        IModelListView modelListView, CollectionSourceBase collectionSource) {
        return new TestListEditor(modelListView);
    }
}
internal class TestListEditor : ListEditor {
    public TestListEditor(IModelListView modelListView) {
        SetModel(modelListView);
    }
    protected override object CreateControlsCore() {
        throw new NotImplementedException();
    }
    protected override void AssignDataSourceToControl(object dataSource) { }
    public override void Refresh() { }
    public override System.Collections.IList GetSelectedObjects() {
        return new List<object>();
    }
    public override SelectionType SelectionType {
        get { return SelectionType.MultipleSelection; }
    }
    public override DevExpress.ExpressApp.Templates.IContextMenuTemplate ContextMenuTemplate {
        get { return null; }
    }
}

通过上面说明的TestApplication实现,您可以在单元测试中使用XafApplication.CreateListView方法。

相关文章

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