2010-04-08 3 views
1

Problème: lors de l'exécution, les instances de classes dérivées de System.Workflow.ComponentModel.Activity sont sérialisées par le moteur de workflow. Je voudrais tester ces types unitaires afin de s'assurer qu'ils peuvent être sérialisés. À partir de maintenant, ces exceptions n'apparaissent que dans la production.Comment tester unitairement qu'une activité Windows Workflow Foundation (WF) peut être sérialisée?

solution non-travail:

public class UnitTestActivity : Activity 
{} 

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

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

Le test ci-dessus donne l'exception suivante « System.InvalidOperationException: Ceci est une opération de temps de conception invalide Vous ne pouvez effectuer l'opération lors de l'exécution. ».

J'ai également essayé la méthode activity.Save(...) qui lance la même exception. Le code est je:

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

Quelle est l'exception que vous recevez lors de l'exécution? La même InvalidOperationException? –

+0

Non, c'est l'exception SerializationException "habituelle". –

+0

Nous avons découvert que le système n'utilisait pas WF pour quelque chose de particulièrement utile, donc nous avons refactorisé le code pour ne pas utiliser WF du tout. –

Répondre

0

I mis en œuvre une solution de contournement qui boucle à travers tous les champs de chaque héritier Activity et tente de sérialiser. Le test NUnit ressemble à cela (helpers omis):

[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

Je pense que vous auriez besoin pour faire tourner une instance avec un service de persistance dans l'hôte, et essayer de persister il.

(Le type de flux de travail personnalisé est lui-même aucun numéro de série lors de la persistance du flux de travail, mais juste son état.)

Questions connexes