2008-11-20 6 views
2

J'ai travaillé sur un wrapper pour un objet COM qui ne peut prendre et renvoyer que des chaînes. L'interface de l'objet COM ressemble à ceci:Mocking d'un objet COM

interface IMapinfo 
    { 
     void Do(string cmd); 
     string Eval(string cmd); 
    } 

Maintenant, j'ai fait des classes qui enveloppent les fonctions de base comme ceci:

public class Table 
    { 
     IMapinfo MI; 
     public string Name 
     { 
      //pass the command to the COM object and get back the name. 
      get{return MI.Eval("TableInfo(1,1")");} 
     } 

    } 

Maintenant, je voudrais faire des tests unitaires sur ces classes sans avoir pour créer l'objet COM réel à chaque fois, configurez le monde puis exécutez les tests. J'ai donc cherché à utiliser des objets simulés, mais je suis un peu confus sur la façon dont j'utiliserais moqueur dans cette situation.

Je prévois sur l'utilisation Moq, donc je l'ai écrit ce test comme celui-ci:

 [Test] 
     public void MockMapinfo() 
     { 
      Moq.Mock<Table> MockTable = new Moq.Mock<Table>(); 
      MockTable.ExpectGet(n => n.Name) 
       .Returns("Water_Mains"); 

      Table table = MockTable.Object; 
      var tablename = table.Name; 

      Assert.AreEqual("Water_Mains", tablename,string.Format("tablename is {0}",tablename)); 
      Table d = new Table(); 
     } 

Est-ce la bonne façon de se moquer de mon objet COM? Comment est-ce que la vérité que la chaîne envoyée à la fonction eval est correcte? ou est-ce que je fais tout faux?

+0

Qu'est-ce qui est à la baisse? –

Répondre

3

Est-ce un doublon? How would I do TDD with a COM OLE object

EDIT: On dirait que vous posez la même question, mais pour valider votre code moqueur (OOPS).

Vous n'êtes pas tout à fait là pour votre scénario moqueur. Vous avez le droit de vouloir isoler les dépendances externes, et votre objet COM répond certainement à ces critères. Bien que je ne suis pas un gars de moq (je préfère RhinoMocks) l'idée derrière simulacres est le test d'interaction ...

test d'interaction est sur la façon dont des ensembles d'objets cohérents travaillent ensemble. Un test valide dans ce scénario consisterait à écrire un test pour le composant qui dépend du comportement de votre objet COM.

Dans ce cas, votre "Table" qui agit comme un wrapper pour votre objet COM dépend également du comportement de l'objet COM. Par exemple, supposons que votre objet Table exécute une logique personnalisée par rapport aux valeurs renvoyées par votre objet COM.

Vous pouvez maintenant écrire des tests isolés pour votre objet Table tandis que simulant le comportement de votre objet COM à l'aide de Mocks. Peut-être que votre objet COM lève des exceptions lorsqu'il est appelé, ou peut-être qu'il ne gère pas très bien les expressions de chaîne. Nous testons actuellement la façon dont notre objet Table interagit avec IMapInfo sans être lié à l'implémentation de l'objet COM. Nous appliquons également une relation entre Table et IMapInfo en ce sens que l'objet IMapInfo doit être appelé pendant le test.

Espérons que cela aide.

+0

Soft de is, mais à ce moment-là, j'utilisais simplement l'objet COM straight pour passer les chaînes et maintenant j'ai un tas de couches que la chaîne traverse, si cela a du sens. –

+0

et cette fois je suis plus à la recherche de "est-ce correct" plutôt que "si je devrais utiliser des faux" tapez la question –

+0

J'ai mis à jour ma réponse. Votre exemple est faux vous affirmez que le cadre fictif vous donne la valeur que vous lui avez fournie, qui passera toujours. Mon exemple montre comment tester l'interaction entre Table et IMapInfo. – bryanbcook