如何对工作流程的一部分进行单元测试?

时间:2013-03-11 23:22:48

标签: .net unit-testing workflow-foundation-4 workflow-foundation

我打算只测试一个工作流程的一个序列(它不是一个单独的CodeActivity)。 有没有办法可以只调用所需的序列并传入所需的参数?

感谢您的关注。

4 个答案:

答案 0 :(得分:2)

我通常做的是在几个子工作流程中拆分工作流程。

因此,您可以做的是创建一个活动,将此序列放入其中,然后在主工作流中替换它。之后,您可以单独测试它。

我希望它有所帮助。

答案 1 :(得分:1)

答案是:不,你不能。

至少效率不高。你可以用工作流的XAML做一堆思考。我想到了内部序列的提取,但请不要这样做!

如果您的序列使用在外部范围上分配的局部变量,那该怎么办?只有一个人认为在测试一个孤立的内部序列时会出错。

无论如何,你为什么要做那样的事情?这就像单元测试一个方法调用,它在另一个方法中。要么调用外部方法(工作流本身),要么隔离内部方法(序列)以便能够测试它。

修改

好的,如果你想继续使用它,并计算你拥有庞大的工作流程的XAML,也许你可以逃避这样的事情:

将XAML加载到活动:

var activity = ActivityXamlServices.Load("c:\hugeworkflow.xaml");

进行序列化活动,并计算出您知道内部序列的位置,在activity内搜索它。让我们假设该序列在另一个序列(工作流根目录)中:

var rootSequence = activity as Sequence;

var innerSequence = rootSequence
                    .Activities
                    .FirstOrDefault(a => a is Sequence) as Sequence;

现在你可以像这样执行内部序列:

var arguments = new Dictionary<string, object> 
{
    { "IntArgument", 10 },
    { "StringArgument", "hello world" }
};

WorkflowInvoker.Invoke(innerSequence, arguments);

我怎么能从序列中断言,我不知道。

没有测试过这些代码,所以可能会遗漏某些内容,但是你明白了。

答案 2 :(得分:0)

您可以使用codeplex中的Microsoft.Activities.UnitTesting库对您的个人活动进行单元测试。 More documentation符合您的情况。

答案 3 :(得分:0)

您可以使用一种技术来实现这一目标,但这并不是非常简单。我们的想法是用模拟活动替换这一序列之外的所有其他活动,并使用Microsoft.Activities.UnitTesting项目调用工作流。

此链接here解释了我的意思

出于好奇,鉴于SOLID原则大量提倡接口隔离和单一责任,您是否认为将您称为原子单元(因此希望独立测试)的工作流段分离为单独的活动没有任何优点或儿童工作流程?