我打算只测试一个工作流序列(它不是单独的 CodeActivity)。有没有一种方法可以只调用所需的序列并传入所需的参数?
感谢您的关注。
我打算只测试一个工作流序列(它不是单独的 CodeActivity)。有没有一种方法可以只调用所需的序列并传入所需的参数?
感谢您的关注。
我通常做的是将工作流分成几个子工作流。
因此,您可以做的是创建一个活动,将这个序列放入其中,然后在主工作流中替换它。之后,您可以单独测试它。
我希望它有所帮助。
答案是:不,你不能。
至少效率不高。您可以使用工作流的 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);
你怎么能从一个序列中断言一些东西,我不知道。
尚未测试任何此代码,因此可能缺少某些内容,但您明白了。
您可以采用一种技术来实现这一点,但这并不是很简单。想法是用模拟活动替换这一序列之外的所有其他活动,并使用 Microsoft.Activities.UnitTesting 项目调用工作流。
这个链接在这里解释了我的意思
出于好奇,鉴于 SOLID 原则大力提倡接口隔离和单一职责,您是否认为将您称为原子单元(并因此希望独立测试)的工作流程的那些部分隔离到单独的活动或子工作流程中没有任何好处?