WF单元测试系列4:测试Workflow
2010-10-01 08:19:36 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閹冣挃闁硅櫕鎹囬垾鏃堝礃椤忎礁浜鹃柨婵嗙凹缁ㄧ粯銇勯幒瀣仾闁靛洤瀚伴獮鍥敍濮f寧鎹囬弻鐔哥瑹閸喖顬堝銈庡亝缁挸鐣烽崡鐐嶆棃鍩€椤掑嫮宓佸┑鐘插绾句粙鏌涚仦鎹愬闁逞屽墰閹虫捇锝炲┑瀣╅柍杞拌兌閻ゅ懐绱撴担鍓插剱妞ゆ垶鐟╁畷銉р偓锝庡枟閻撴洘銇勯幇闈涗簼缂佽埖姘ㄧ槐鎾诲礃閳哄倻顦板┑顔硷工椤嘲鐣烽幒鎴旀瀻闁规惌鍘借ⅵ濠电姷鏁告慨顓㈠磻閹剧粯鈷戞い鎺嗗亾缂佸鏁婚獮鍡涙倷閸濆嫮顔愬┑鐑囩秵閸撴瑦淇婇懖鈺冪<闁归偊鍙庡▓婊堟煛鐏炵硶鍋撻幇浣告倯闁硅偐琛ラ埀顒冨皺閺佹牕鈹戦悙鏉戠仸闁圭ǹ鎽滅划鏃堟偨缁嬭锕傛煕閺囥劌鐏犻柛鎰ㄥ亾婵$偑鍊栭崝锕€顭块埀顒佺箾瀹€濠侀偗婵﹨娅g槐鎺懳熺拠鑼舵暱闂備胶枪濞寸兘寮拠宸殨濠电姵纰嶉弲鎻掝熆鐠虹尨宸ョ€规挸妫濆铏圭磼濡搫顫嶇紓浣风劍閹稿啿鐣烽幋锕€绠婚悹鍥у级瀹撳秴顪冮妶鍡樺鞍缂佸鍨剁粋宥夋倷椤掍礁寮垮┑鈽嗗灣閸樠勭妤e啯鍊垫慨妯煎亾鐎氾拷

前面几篇介绍了如何对Activity进行状态测试,行为测试,及Mock Object Framework的使用。当然,仅仅测试Activity是不够的,我们最终还要对整个Workflow进行测试。这一篇就为大家讲一下如何对Workflow进行测试。
在上一篇的NewEmployeeWFLibrary工程里,添加一个名为StoreNewAcmeEmployee的顺序工作流。为工作流添加三个属性和一个事件:
Property
public string FirstName { get; set; }
public string LastName { get; set; }
public AcmeEmployee NewEmployee { get; set; }
我们设定这个工作流的功能是根据给定的FirstName和LastName生成一个AcmeEmployee对象。下面我们开始写测试代码。在测试工程中添加一个测试类ProvisionNewEmployee_WorkflowShould,代码如下:
ProvisionNewEmployee_WorkflowShould
[TestClass]
public class ProvisionNewEmployee_WorkflowShould
{
private AcmeEmployee _createAcmeEmployee;
private ManualWorkflowSchedulerService _manualScheduler;
private WorkflowRuntime _runtime;
[TestInitialize]
public void TestInitializer()
{
_manualScheduler = new ManualWorkflowSchedulerService();
_runtime = new WorkflowRuntime();
// Add the scheduler to the _runtime before it is started
_runtime.AddService(_manualScheduler);
// when the workflow completes, assign the output value to a test
// class member so it can be evaluated.
_runtime.WorkflowCompleted += ((o, e) =>
{
if (o == null) throw new
ArgumentNullException("o");
_createAcmeEmployee =
(AcmeEmployee)
e.OutputParameters["NewEmployee"];
});
// this event will fire if an exception occurs in the runtime.
_runtime.WorkflowTerminated += ((o, e) =>
{
// but throwing it again means the runtime will handle it
// in ServicesExceptionNotHandled
throw e.Exception;
});
// The WF runtime wants to manage exceptions here all by itself
// so we throw the expection again to ensure it gets into the
// test class itself
_runtime.ServicesExceptionNotHandled += ((o, e) => { throw e.Exception;
});
}
[TestMethod]
public void CreateAValidAcmeEmployee()
{
RunTheWorkflow(Mother.FIRST_NAME, Mother.LAST_NAME);
AcmeEmployeeAssert.AreEqualExceptForId(_createAcmeEmployee,
Mother.CreateNewAcmeEmployee());
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ThrowExceptionOnNullFirstName()
{
RunTheWorkflow(null, Mother.LAST_NAME);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ThrowExceptionOnNullLastName()
{
RunTheWorkflow(Mother.FIRST_NAME, null);
}
private void RunTheWorkflow(string firstName, string lastName)
{
// Setup the input parameters
// The name of the argument here must match the
// name of the property on the workflow class
var args = new Dictionary<string, object>
{
{"FirstName", firstName},
{"LastName", lastName}
};
WorkflowInstance targetWorkflow =
_runtime.CreateWorkflow(typeof(ProvisionNewEmployee), args);
targetWorkflow.Start();
_manualScheduler.RunWorkflow(targetWorkflow.InstanceId);
}
}
- ››WF 4.0 beta1中的跟踪机制
- ››WF 4.0的建模风格:顺序和Flowchart
- ››WF4.0 Beta1之旅(5):规则引擎的变化
- ››WF 4.0 beta1活动概览(1):Procedural
- ››WF4.0 Beta1之旅(4):Bookmark的使用
- ››WF4.0 Beta1之旅:基本介绍
- ››WF4.0 Beta1之旅(2):异常处理
- ››WF4.0 Beta1之旅(3):全新的FlowChart
- ››WF 应用场景指南: SharePoint 与工作流(上)
- ››WF 应用场景指南: 展现流(Presentation Flow)
- ››WF单元测试系列1:测试基本的Activity
- ››WF单元测试系列2:简单测试Activity的行为
赞助商链接