技术开发 频道

详解如何在WPF中创建测试工作流

  【IT168 技术文档】到目前为止,这个程序并不是特别有趣。它只能在控制台中运行,并且不能接受任何的参数输入。大部分有意义的程序都必须能够处理输入输出数据。另外,现在的这个程序并不是很容易测试。

  在这个练习中,你将会修改SayHello活动,为其添加参数用于返回数据,而不是使用WriteLine活动将数据打印在控制台中,从而使之能在非控制台的程序中使用。 这次我们使用一种测试优先的方式。首先,你需要建立你的测试项目,在一开始它会失败,然后你需要添加必要的代码让其通过。

  最终的程序将会等同于如下代码的功功能。

  private static string SayHello(string name)
  {
  
return "Hello " + name + " from Workflow 4";
  }
  Private Shared Function SayHello(ByVal name As String) As String
  Return
"Hello " & name & " from Workflow 4"
  End Function

   1.打开解决方案

  你可以使用练习4中建立的解决方案作为这个练习的起始方案。或者你可以根据以下步骤开始练习5。

  (1)选择Start | All Programs | Microsoft Visual Studio 2010以运行Microsoft Visual Studio 2010。

  (2)打开%TrainingKitInstallFolder%\Labs\ IntroToWF\Ex5-Testing\Begin目录下的练习5 的起始方案以开始这个练习。

  (3)按CTRL+SHIFT+B键编译解决方案。

  2.建立单元测试项目

  (1)首先我们为工作流建立单元测试来验证其运行结果正确与否。在Solution Explorer中,右键单击HelloWorkflow解决方案,选择Add / New Project并设置项目选项。

  ·选取Installed Templates,选择Visual C#或Visual Basic然后选择Test

  ·选择Test Project

  ·设置项目名称为HelloWorkflow.Tests


在解决方案中添加新的测试工程 (C#)


在解决方案中添加新的测试工程 (Visual Basic)

  (2)右键单击HelloWorkflow.Tests项目,并单击Add Reference。选择Projects选项卡,添加HelloWorkflow为项目引用。重复以上步骤,使用.NET选项卡添加System.Activities库为引用。

  (3)右键单击UnitTest1.cs (C#)或UnitTest1.vb (Visual Basic),选择Rename并重命名为SayHelloTests.cs (C#)或SayHelloTests.vb (Visual Basic)。当提示重命名UnitTest1类时选择Yes。

  3.创建测试用例

  在这个任务中,你再将在真正实现活动之前建立测试用例。

  (1)添加下列命名空间到SayHelloTests.cs (C#) 文件或SayHelloTests.vb (Visual Basic):

  using System.Activities;
  
using HelloWorkflow;
  Imports System.Activities

  (2)建立一个测试用例用于验证工作流执行正确。请打开SayHelloTests.cs (C#)或SayHelloTests.vb (Visual Basic),将TestMethod1方法重命名为ShouldReturnGreetingWithName。

  虽然目前SayHello活动并不接受任何参数,但是我们将会使用代码调用它,就像它能接受参数一样 。这将会让我们思考如何设计活动的接口并使用它。如果Visual Studio提示UserName属性没有被定义,请不要担心。替换ShouldReturnGreetingWithName 中的代码如下C#

  [TestMethod]

  
public void ShouldReturnGreetingWithName()

  {

  IDictionary output;

  output
= WorkflowInvoker.Invoke(

  
new SayHello()

  {

  UserName
= "Test"

  });

  Assert.AreEqual(
"Hello Test from Workflow 4", output["Greeting"]);

  }

  Visual Basic

   Public Sub ShouldReturnGreetingWithName()

  Dim output
= WorkflowInvoker.Invoke(

  New SayHello() With {.UserName
= "Test"})

  Assert.AreEqual(
"Hello Test from Workflow 4", output("Greeting"))

  End Sub

  如果向活动传入参数?

  你可以建立一个活动并使用对象初始化的方法初始化参数(它是一个public的属性),或者你可以使用Invoke函数的Dictionary (C#)或Dictionary(Of String, Object) (Visual Basic)参数,通过名称将数据映射到活动的参数上。

  如何取得工作流的输出数据?

  output变量是IDictionary (C#)或IDictionary(Of String, Object) (Visual Basic),它包含一组使用变量名作为关键字的数据映射。

  4.编译程序

  活动的输入输出接口看上去不错,但是程序还没有被编译过。我们第一个目标是使程序能编译成功。

  (1)按CTRL+SHIFT+B以编译程序,你将会看到编译失败


UserName没有定义(C#)


UserName没有定义(VB)

  (2)在设计器中打开SayHello.xaml

  (3)单击Arguments按钮打开参数编辑窗口


单击Argument按钮打开参数编辑窗口

  (4)添加UserName和Greeting 参数,如下图所示


定义活动的参数

  参数

  在Windows Workflow Foundation (WF),参数用于表示活动输入和输出的数据流。活动的参数组成了这个活动的特征。每个参数拥有一个定义好的方向:输入、输出或输入/输入。

  (5)按CTRL+SHIFT+B 编译解决方案,这次应该编译成功。

  5.观察测试运行失败

  观察测试运行失败的重要性在于确认我们的测试代码不存在bug导致测试在任何情况下都是通过的。 在这个任务中,我们将会确认我们的测试用例的的确确运行失败了。

  按CTRL+R,T以运行单元测试。测试用例将会运行但是失败,因为我们的活动的Greeting参数没有返回任何数据。


ShouldReturnGreetingwithName测试

  6.使测试通过

  现在我们知道我们的测试用例是工作的,我们需要做些最简单的工作让测试通过。

  (1)我们需要删除WriteLine 活动,因为在控制台中输出数据不能使我们的测试通过,右击WriteLine 活动并选择Delete ( )。

  (2)我们需要为Greeting赋值。首先,在工具栏中选择Primitives 组,拖放Assign活动到设计器中。


拖放Assign活动到设计器

  (3)设置To属性为Greeting


在左边的输入框中输入Greeting

  (4)我们可以在设计器上输入问候的表达式,由于我们的表达式更长,所以使用属性窗口。单击Value属性右边的按钮,弹出参数编辑器。


单击Value属性右边的按钮

  (5)在参数编辑器中,你可以输入更长的表达式,包括VB的换行字符“_”。设置参数为"Hello " & UserName _& " from Workflow 4"


使用Assign活动为Greeting参数赋值

  如果你是C#程序员,你可能不是很熟悉Visual Basic的语法。在Visual Basic的语法中,如果你需要将一个表达式跨行书写,你需要用下划线表示表达式在下移行中继续。

  (6)按CTRL+SHIFT+B编译解决方案,应该编译通过。

  7.验证

  现在我们准备运行测试用例并观察我们的活动通过这个测试

  (1)打开Test View窗口。在Test菜单中选择Windows并单击Test View ( )。

  (2)在Test View窗口中,选择ShouldReturnGreetingWithName测试并单击Run Selection 按钮( )。


选择并运行ShouldReturnGreetingWithName测试

  注意

  由于Visual Studio 2010 Beta 2在运行测试时不会自动保存XAML文件。在运行测试前你必须手动编译你的解决方案,否则他将继续失败。

  (3)验证测试通过。


测试通过

0
相关文章