8

コード化されたアクティビティを作成し、それを単体テストしたいのですが、方法がわかりません。どんな例でも大歓迎です。

私の簡単な例を以下に示します。

  public sealed class ParameterActivity : CodeActivity
{
    public InArgument<int> Argument1 { get; set; }
    public InArgument<int> Argument2 { get; set; }
    public OutArgument<int> Result { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        var a = context.GetValue(Argument1);
        var b = context.GetValue(Argument2);

        context.SetValue(Result, a + b);
    }
}
4

1 に答える 1

20

まず、アクティビティが単一の値を返す場合は、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も確認してください。

于 2012-05-02T22:41:45.697 に答える