まず、アクティビティが単一の値を返す場合は、CodeActivity<TResult>から継承し、戻り値の型としてTResultを使用してExecute()を簡単にオーバーライドします。さらに、既にOutArgument<TResult> Resultを利用できます。
public sealed class ParameterActivity : CodeActivity<int>
{
public InArgument<int> Argument1 { get; set; }
public InArgument<int> Argument2 { get; set; }
protected override int Execute(CodeActivityContext context)
{
var a = Argument1.Get(context);
var b = Argument2.Get(context);
return a + b;
}
}
そうは言っても、WorkflowInvokerは、ほぼすべてのアクティビティを単体テストする方法です。上記のカスタム コード アクティビティを例として取り上げます。
[TestFixture]
public sealed class ParameterActivityTests
{
[Test]
public void ParameterActivity_Test()
{
var activity = new ParameterActivity();
var input1 = new Dictionary<string, object>
{
{ "Argument1", 10 },
{ "Argument2", 5 }
};
var input2 = new Dictionary<string, object>
{
{ "Argument1", -13 },
{ "Argument2", 3 }
};
var output1 = WorkflowInvoker.Invoke<int>(activity, input1);
var output2 = WorkflowInvoker.Invoke<int>(activity, input2);
Assert.That(output1, Is.EqualTo(15));
Assert.That(output2, Is.EqualTo(-10));
}
}
WorkflowInvokerの代わりに、WorkflowApplicationを使用することもできますが、単体テストでは、存続期間の短いワークフローをすばやく呼び出して「自分のこと」を実行して返すだけの場合は、まったく必要ないように思われます。非同期ワークフローやブックマークなど、より複雑なものをテストしたい場合を除きます。
Microsoft.Activities.UnitTestingも確認してください。