WEB开发网
开发学院软件开发C语言 WF单元测试系列1:测试基本的Activity 阅读

WF单元测试系列1:测试基本的Activity

 2010-10-01 08:19:44 来源:WEB开发网   
核心提示:Windows Workflow Foundation是一套非常灵活,易用,WF单元测试系列1:测试基本的Activity,架构良好的工作流平台,目前使用WF开发工作流的也越来越多,在以后的文章里,我将为大家介绍更复杂的WF测试方法,但市面上却鲜见有关WF单元测试的文章,今天笔者就介绍一下如何对WF进行单元测试

Windows Workflow Foundation是一套非常灵活,易用,架构良好的工作流平台。目前使用WF开发工作流的也越来越多,但市面上却鲜见有关WF单元测试的文章。今天笔者就介绍一下如何对WF进行单元测试,以及如何对WF应用TDD(测试驱动开发)。

熟悉WF的人都知道,WF是一些按结构组织好的Activity在Runtime里执行。Runtime提供运行环境,管理Activity的执行,Activity负责做具体的事情。我们测试WF,当然测试的就主要是Activity。

大家知道Activity所做的事情都在Execute()方法里。Runtime就是通过调用Activity的Execute方法执行它的。但WF里有一个限制,就是Activity的Execute()方法是Protected(保护)的。我们的测试代码不能直接调用它。所以我们要绕过这个限制,使得我们能调用Execute()方法。        

其实也很简单,解决方法其实也就在这个Protected里,大家都知道:Protected方法只允许类本身,和它的子类调用。这就给我们一个启示,我们只要添加一个子类,集成要测试的Activity,不就可以调用父类的Execute方法了吗!       

说干就干:比如我现在有一个叫做GetEmailAddress的Activity。它负责根据用户提供的两个参数LastName和FirstName,

生成一个Email地址(具体生成Email的方法,跟本文无关)。在这里,GetEmailAddress从另一个叫做BaseEmployeeActivity的

Activity集成而来,这个基类没有做任何事情,只是定义了三个DependencyProperty:LastName,FirstName和Email,用来

保存输入参数和生成的Email地址。这里只列出GetEmailAddress的Execute方法(): GetEmailAddress.Execute()
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {

            Email = EmailAddressCreator.GetInstance().CreateEmailAddress(FirstName, LastName);
            return ActivityExecutionStatus.Closed;
        }

代码很简单,调用了另一个类的方法,生成了Email,然后结束Activity的执行。

接下来我们开始测试这个Activity。首先添加一个新Ativity:GetEmailAddress_Accessor,从GetEmailAddress继承。

在新Activity中添加一个方法:

GetEmailAddress_Accessor.Execute()
        internal ActivityExecutionStatus Execute_Accessor(ActivityExecutionContext executionContext)
        {
            return base.Execute(executionContext);
        }

注意,我们并没有override 父类的Execute(),只是添加了一个新的方法,在里面调用了父类的Execute方法。而且

这个方法的访问级别为Internal,这样就能被我们的测试方法调用了。

下面写测试代码。这里我们新建一个VSTS的测试工程(当然你也可以使用其他的单元测试工具,如Nunit)。

添加一个测试方法:       

CreateAnEmailAddress
        [TestMethod]
        public void CreateAnEmailAddress()
        {
            GetEmailAddress_Accessor activity = new GetEmailAddress_Accessor();
            activity.FirstName = Mother.FIRST_NAME;
            activity.LastName = Mother.LAST_NAME;


            activity.Execute_Accessor(null);
            Assert.AreEqual(activity.Email.ToLower(), Mother.EMAIL.ToLower());
        }

在上面的测试代码里,首先实例化被测试的Activity,然后设置两个参数,调用被测试的方法,最后测试生成的Email。

运行单元测试,通过!

在上面的文章里,我们只是通过包装(Wrap)了被测试的Activity,就达到了测试的目的。当然,这只是

最简单的测试,在以后的文章里,我将为大家介绍更复杂的WF测试方法。

注:以上示例来自WF3.5 Hands On Lab,英文好的朋友可以去这里看:https://www.microsoft.com/resources/virtuallabs/step3-msdn.aspx?LabId=c4a993a5-d498-4d5c-9f98-476c1f496d15&BToken=reg

系列文章:

WF单元测试系列2:简单测试Activity的行为

WF单元测试系列3:测试Activity的行为

Tags:WF 单元

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接