我正在使用分布式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。
我缺少任何订单吗?
答案 0 :(得分:0)
我认为您正在编写一个测试来测试错误消息的格式,而不是哪些字段实际上是强制性的。必填字段列表不一定在内部存储为列表,因此无法保证如何从集合中读取它们。
我会编写4个测试用例,其中为所有参数提供值,然后每个参数都丢失一个参数,确认抛出异常并且这些错误消息包含预期参数的名称。