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