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

时间:2010-04-08 08:44:21

标签: c# unit-testing serialization workflow-foundation

问题:在执行期间,由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 );
   }
}

2 个答案:

答案 0 :(得分:0)

我认为您需要在主机中使用持久性服务来启动实例,并尝试继续使用它。

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

答案 1 :(得分:0)

我实现了一个解决方案,它遍历每个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
                                }
                            } );
}