到现在为止,我们的应用程序并不吸引眼球,它仅仅只是在控制台上进行了简单的输出而且没有接受任何的输入。真正有用的应用程序中应该包含一些输入、输入参数,同时,我们现在的应用程序也不利于测试。
在本次练习中,我们将在SayHello Activity中使用参数,同时会返回一些结果,这样可以使我们的活动不仅仅只是在控制台中简单的输出字符串,而且还可以被非控制台环境所调用。简单的说,我们希望SayHello活动能够达到下面的效果:
private static string SayHello(string name) { return "Hello " + name + " from Workflow 4"; }
即根据输入,返回输出结果。
1、打开我们在上一练习中创建的HelloWorkflow解决方案,添加单元测试项目Test Project,测试项目名称为:HelloWorkflow.Tests
2、在单元测试项目中添加对HelloWorkflow和System.Activities的引用,另外将UnitTest1.cs类重命名为SayHelloFixture.cs.重命名TestMethod1 方法名为ShouldReturnGreetingWithName
3、SayHello活动现在并没有接受任何参数,但是我们仍然可以调用该活动并假设它会接受某些参数。这可以帮助我们设计这些活动实现的接口。不必担心VS会提示属性或参数不存在。现在我们假设SayHello活动包含一个属性UserName,代码如下:
[TestMethod] public void ShouldReturnGreetingWithName() { IDictionary<string, object> output; output = WorkflowInvoker.Invoke( new SayHello() { UserName = "Test" } ); Assert.AreEqual("Hello Test from Workflow 4", output["Greeting"]); }
我们对活动的参数赋值有两种方式,一是对活动的参数(表现形式为公共属性)初始化,二是传递一个Dictionary<string, object>类型的集合参数给活动,集合的Key映射到活动的参数名,集合的Value值就是要赋给对应参数的值。
活动的输出参数类型是IDictionary<string, object>,其中包含活动中的所有输出参数。
4、现在编译测试项目,会出现以下错误
解决办法,在SayHello活动器中添加名为UserName的输入参数,以及名为“Greeting”的输出参数
在WF中,参数代表着活动的输入数据流和输出数据流。一个活动有着参数集合,这个参数集合构成了活动签名,每一个参数都有一个指定的方向,输入|输出|输入并输出。
5、重新生成解决方案,成功。运行测试,失败
从上图中我们可以看到由于输出参数Greeting为空,导致Assert失败。原因:我们在SayHello活动中只是将字符串内容输出到控制台,但是并没有为输出参数赋值。
6、使用Assign活动为参数赋值
删除原来的WriteLine基元活动,添加Assign基元活动
右键打开Assign活动的属性窗口
7、打开测试管理器
运行测试后,显示测试成功
系列文章:
一 Hello Workflow4
二 The CodeActivity
三 Dynamic Workflows with XAML
四 Testing Workflows
五 WorkflowApplication
六 If/Else Logic