Windows Workflow Foundation多个RequiredArgument字段验证顺序

时间:2017-06-16 17:02:20

标签: workflow-foundation-4 workflow-foundation

我正在使用分布式WF应用程序,在那里我创建了几个自己的活动。其中一些具有我想要测试的强制性InArguments。 我想要实现的是在没有任何InArgument的情况下执行活动,并使用动态生成的异常消息断言期望的ArgumentException的异常消息,我期望抛出它。

举个例子,我们有以下活动

public class MyActivity : CodeActivity<bool>
{
    public MyActivity()
    {
        // some logic
    }

    [RequiredArgument]
    public InArgument<string> ArgA { get; set; }

    [RequiredArgument]
    public InArgument<string> ArgB { get; set; }

    [RequiredArgument]
    public InArgument<string> ArgC { get; set; }
}

我正在将NUnit与Microsoft.Activities.UnitTesting

结合使用
[TestFixture]
public class MyActivityTests
{
    [Test]
    public void ValidateContainsMandatoryFields()
    {
        var activity = new MyActivity();
        var mandatoryFields = new ReadOnlyCollection<string>(new [] { "ArgA", "ArgB", "ArgC" });
        var expectedExceptionMsg = GenerateMsg(activity.DisplayName, mandatoryFields);
        var sut = new WorkflowInvokerTest(activity);
        var ex = Assert.Throws<ArgumentException>(delegate { sut.TestActivity(); });
        Assert.AreEqual(expectedExceptionMsg, ex.Message);
    }

    private string GenerateMsg(string displayName, IReadOnlyCollection<string> mandatoryFieldsNames)
    {
        var sb = new StringBuilder(@"The values provided for the root activity's arguments did not satisfy the root activity's requirements:");

        foreach (var fieldName in mandatoryFieldsNames)
        {
            sb.Append(string.Format("\r\n'0': Value for a required activity argument '{1}' was not supplied.", displayName, fieldName));
        }

        sb.Append("\r\nParameter name: rootArgumentvalues");
        return sb.ToString()
    }
}

问题我面临的是,我确实希望按字母顺序排列InArguments(argA,argB,argC),但由于某些原因,字段按照我认为的顺序排序随机(但总是以相同的顺序)。在我的例子中,例如,argB,argA,argC。

我缺少任何订单吗?

1 个答案:

答案 0 :(得分:0)

我认为您正在编写一个测试来测试错误消息的格式,而不是哪些字段实际上是强制性的。必填字段列表不一定在内部存储为列表,因此无法保证如何从集合中读取它们。

我会编写4个测试用例,其中为所有参数提供值,然后每个参数都丢失一个参数,确认抛出异常并且这些错误消息包含预期参数的名称。