2009-05-19 6 views
0

Afin d'obtenir une bonne couverture de test, je veux tester les méthodes de IPortableObjectWriteExternal et ReadExternal (comme décrit à Creating an IPortableObject Implementation (.NET)).Le test d'une mise en œuvre Oracle Coherence IPortableObject dans .NET

Voici un code similaire à ce que j'ai dans ma méthode de test (que j'aime, et ça marche).

Mais pour que cela fonctionne, je fisse la sous-classe PofStreamWriter pour remplacer BeginProperty et PofStreamReader pour remplacer AdvanceTo. Pour moi, cela sent un peu drôle, mais je ne pouvais pas trouver une meilleure solution. Voici mon code actuel pour mon CoherenceTestHelper.

Question: Est-ce que quelqu'un d'autre a testé son implémentation IPortableObject d'une meilleure façon?

public static class CoherenceTestHelper 
{ 
    public static T CopyUsingPofSerialization<T>(T ipoIn) where T : IPortableObject, new() 
    { 
     T ipoOut = new T(); 

     IPofContext context = new SimplePofContext(); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
     IPofWriter writer = new MyPofStreamWriter(new DataWriter(ms), context); 
     ipoIn.WriteExternal(writer); 

     ms.Seek(0, 0); 
     IPofReader reader = new MyPofStreamReader(new DataReader(ms), context); 
     ipoOut.ReadExternal(reader); 
     } 

     return ipoOut; 
    } 

    private class MyPofStreamWriter : PofStreamWriter 
    { 
     public MyPofStreamWriter(DataWriter writer, IPofContext context) 
     : base(writer, context) 
     { 
     } 

     protected override void BeginProperty(int index) 
     { 
     } 
    } 

    private class MyPofStreamReader : PofStreamReader 
    { 
     public MyPofStreamReader(DataReader reader, IPofContext context) 
     : base(reader, context) 
     { 
     } 

     protected override bool AdvanceTo(int index) 
     { 
     return true; 
     } 
    } 
} 

Répondre

0

Ce test est trop préoccupé par l'exécution effective du IPofReader et IPofWriter. Je vous suggère de créer une maquette du lecteur/écrivain en utilisant un cadre comme Rhino Mocks. Passez votre (vos) méthode (s) POF au lecteur/écrivain mocké. Ensuite, il suffit d'affirmer que les méthodes de lecture/écriture ont été appelées avec les paramètres corrects.

+0

Ensuite, j'aurais besoin d'un simulacre spécifique pour chaque implémentation d'IPortableObject, où cette aide peut être utilisée contre n'importe quel objet. Aussi, je veux m'assurer que les appels (par exemple ReadString et WriteString) sont équilibrés et dans le même ordre, dont je ne suis pas sûr comment moquer. Je suis concerté avec l'exécution réelle. –

0

J'ai examiné la façon de tester l'unité IPofSerializer et je pense que c'est similaire à votre problème. Ce que j'ai trouvé c'est que pour correctement sérialiser et désérialiser le type d'utilisateur, vous devez appeler PofStreamWriter.WriteObject et PofStreamReader.ReadObject. Le type d'utilisateur doit également être enregistré avec le PofContext pour que cela fonctionne correctement.

La raison en est que la classe PofStreamWriter contient une sous-classe imbriquée qu'elle délègue lors de la sérialisation des types d'utilisateur. Cette sous-classe écrit des données supplémentaires sur le type que PofStreamReader utilise ensuite pour désérialiser correctement le type. Sans ces données supplémentaires, le PofStreamReader ne peut pas déterminer quel type il est et quel sérialiseur doit être utilisé. Il semble que ce n'est pas configuré pour permettre le test d'un sérialiseur dans une isolation complète car il y a beaucoup d'état maintenu en interne par le PofStreamReader et PofStreamWriter lors de la sérialisation.

pour le test IPofSerializers que je fais ce qui suit

var context = new SimplePofContext() 
context.RegisterUserType(1001, typeof(SerializableType), new SerializatableTypeSerializer()) 

using (var ms = new MemoryStream()) 
{ 
    var writer = new PofStreamWriter(new DataWriter(ms), context); 
    writer.WriteObject(0, object); 

    ms.Seek(0,0); 

    var reader = new PofStreamReader(new DataReader(ms), context); 
    var ob = reader.ReadObject(0) 
} 

Je soupçonne, mais ne l'ai pas testé, que pour IPortableObjects vous n'avez pas d'enregistrer quoi que ce soit avec le contexte afinde pour que cela fonctionne.