Как выполнить модульное тестирование того, что действие Windows Workflow Foundation (WF) можно сериализовать? - PullRequest
1 голос
/ 08 апреля 2010

Проблема: во время выполнения экземпляры классов, производные от 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 голосов
/ 08 апреля 2010

Я реализовал обходное решение, которое проходит по всем полям каждого 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
                                }
                            } );
}
0 голосов
/ 08 апреля 2010

Я думаю, вам нужно было бы раскрутить экземпляр со службой персистентности на хосте и попытаться сохранить его.

(Пользовательский тип рабочего процесса сам не сериализуется при сохранении рабочего процесса, а только егосостояние.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...