WF代码活动的单元测试

cpo*_*ign 8 unit-testing workflow-foundation-4

我已经创建了编码活动,现在我想对它进行单元测试,但我不知道如何.任何例子将不胜感激.

我的简单例子如下.

  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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*oao 19

首先,如果您的活动返回单个值,只需继承CodeActivity <TResult>并轻松覆盖Execute(),并将TResult作为返回类型.此外,您已经可以使用OutArgument <TResult>结果.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,WorkflowInvoker是几乎所有活动的单元测试方法.以上面的自定义代码活动为例:

[TestFixture]
public TParameterActivity
{
    [Test]
    public void ParameterActivity_Test001()
    {
        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));
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是WorkflowInvoker,您也可以使用WorkflowApplication,但是当您只是想快速调用短期工作流程来执行"他们的事情"并返回时,单独测试似乎根本不需要.除非你想测试更复杂的东西,如异步工作流程和/或书签.

您还需要查看Microsoft.Activities.UnitTesting.