2017-06-16 116 views
0

我正在使用分布式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。

是否有任何我缺少的命令?

回答

0

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

我会写4个测试用例,其中您为所有参数提供值,然后在每个您错过每个参数的位置,确认引发异常并且这些错误消息包含预期参数的名称。