繁体   English   中英

如何对Windows Workflow Foundation(WF)活动可以序列化进行单元测试?

[英]How to unit test that a Windows Workflow Foundation (WF) activity can be serialized?

问题:在执行过程中,从System.Workflow.ComponentModel.Activity派生的类的实例由工作流引擎序列化。 我想对这些类型进行单元测试,以确保可以序列化它们。 到目前为止,这些例外仅在生产中出现。

非工作解决方案:

public class UnitTestActivity : Activity
{}

[Test]
public void ShouldBeSerializable()
{
   var activity = new UnitTestActivity();

   activity.Clone(); // throws exception here
}

上面的测试产生以下异常“ System.InvalidOperationException:这是无效的设计时操作。您只能在运行时执行该操作。”

我也尝试过activity.Save(...)方法,然后抛出相同的异常。 我使用的代码是:

public static void SerializeToFile( Activity activity )
{
   using (var fileStream = new FileStream( GetFilePath(), FileMode.Create ))
   {
      IFormatter formatter = new BinaryFormatter { SurrogateSelector = ActivitySurrogateSelector.Default };

      activity.Save( fileStream, formatter );
   }
}

我认为您将需要在主机中使用持久性服务启动一个实例,然后尝试将其持久化。

(自定义工作流程类型在持久化工作流程时本身不会被序列化,而只是其状态。)

我实现了一种变通方法,该方法遍历每个Activity继承者的所有字段并尝试对其进行序列化。 NUnit测试看起来像这样(省略了助手):

[Test, TestCaseSource( "GetActivities" )]
public void ShouldBeSerializable( Activity activity )
{
    var fieldInfos = activity.GetType().GetFields( BindingFlags.Public | BindingFlags.NonPublic 
                                                   | BindingFlags.Instance | BindingFlags.Static );

    fieldInfos.Where( fieldInfo => fieldInfo.Name != "parent" )
              .ForEach( fieldInfo =>
                            {
                                var fieldValue = fieldInfo.GetValue( activity );

                                if ( fieldValue != null )
                                {
                                    Serializer.Clone( fieldValue ); // no assert, throws exception if not serializable
                                }
                            } );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM