[英]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.