WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院软件开发C语言 WF单元测试系列4:测试Workflow 阅读

WF单元测试系列4:测试Workflow

 2010-10-01 08:19:36 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姇閹碱偆鐥閺屾洘绻濊箛鏇犵獥闂佺厧澹婃禍婊堚€旈崘顏佸亾閿濆骸澧ù鐘欏嫮绠鹃柛顐ゅ枎閻忋儲銇勯弴妯哄姦妞ゃ垺鐟╅幃鈩冩償閵囧府鎷�
核心提示:前面几篇介绍了如何对Activity进行状态测试,行为测试,WF单元测试系列4:测试Workflow,及Mock Object Framework的使用,当然,为工作流添加三个属性和一个事件:Property public string FirstName { get; set; } public string Las

前面几篇介绍了如何对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);
        }
    }

1 2  下一页

Tags:WF 单元

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