Windows Workflow Foundation多个RequiredArgument字段验证命令
问题描述:
我正在使用分布式WF应用程序,我在其中创建了几个自己的活动。其中一些人有强制性的InArguments,我想测试。 我想实现的是在没有任何InArgument的情况下执行活动,并声明期望抛出的动态生成的异常消息的期望ArgumentException异常消息。Windows Workflow Foundation多个RequiredArgument字段验证命令
举个例子,我们有以下活动
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。
是否有任何我缺少的命令?
答
我认为你正在编写一个测试来测试错误消息的格式,而不是哪些字段实际上是强制性的。必填字段列表不一定会在内部存储为列表,因此不能保证它们将如何从集合中读出。
我会写4个测试用例,其中您为所有参数提供值,然后在每个您错过每个参数的位置,确认引发异常并且这些错误消息包含预期参数的名称。