Unit testing WF代码活动的单元测试

Unit testing WF代码活动的单元测试,unit-testing,workflow-foundation-4,Unit Testing,Workflow Foundation 4,我已经创建了编码活动,现在我想对其进行单元测试,但我不知道如何进行。 任何例子都将不胜感激 下面是我的简单示例 public sealed class ParameterActivity : CodeActivity { public InArgument<int> Argument1 { get; set; } public InArgument<int> Argument2 { get; set; } public OutArgument&

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

下面是我的简单示例

  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);
    }
}
公共密封类参数活动性:CodeActivity
{
公共InArgument Argument1{get;set;}
公共非语法参数2{get;set;}
公共输出参数结果{get;set;}
受保护的覆盖无效执行(CodeActivityContext上下文)
{
var a=context.GetValue(Argument1);
var b=context.GetValue(Argument2);
context.SetValue(结果,a+b);
}
}

首先,如果您的活动返回一个值,只需从Execute()继承并使用TResult作为返回类型轻松重写Execute()。此外,您已经有了可用的

公共密封类参数活动性:CodeActivity
{
公共InArgument Argument1{get;set;}
公共非语法参数2{get;set;}
受保护的重写int-Execute(CodeActivityContext上下文)
{
var a=Argument1.Get(上下文);
var b=Argument2.Get(上下文);
返回a+b;
}
}
也就是说,是对几乎所有活动进行单元测试的方法。以上述自定义代码活动为例:

[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));
    }
}
[TestFixture]
公共密封类参数ActivityTests
{
[测试]
公共void参数活动性_测试()
{
var activity=新参数activity();
var input1=新字典
{
{“Argument1”,10},
{“Argument2”,5}
};
var input2=新字典
{
{“Argument1”,-13},
{“Argument2”,3}
};
var output1=WorkflowInvoker.Invoke(活动,input1);
var output2=WorkflowInvoker.Invoke(活动,input2);
断言(output1,即.EqualTo(15));
断言(output2,即.EqualTo(-10));
}
}
相反,您也可以使用but进行单元测试,当您只想快速调用短期工作流让他们完成“他们的事情”并返回时,似乎根本不需要使用but。除非你想测试更复杂的东西,比如异步工作流和/或书签


您还需要检查

我找到了这个非常有用的链接:这与我在回答中向您展示的基本相同。只需使用
CodeActivity
即可创建具有唯一返回值的活动。大多数都是这样。然后,您可以轻松地使用
WorkflowInvoker.Invoke()
来获取值。从我的代码与博客文章的代码之间的差异可以看出,它们也更容易进行单元测试。请务必了解我如何使用Microsoft.Activities.UnitTesting?也
[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));
    }
}