2010-11-17 17 views
11

Nous avons un bug à corriger, et comme tout bon TDD, je veux écrire un test qui échoue pour représenter le bug en premier. Le bug est dans une méthode qui prend un type plutôt complexe en entrée. Le bogue ne se reproduira que lorsque le type complexe aura une certaine combinaison de valeurs de propriétés définies. Jusqu'à présent, j'ai reproduit le bogue et, dans le débogueur, je peux voir la valeur d'exécution du type complexe. Maintenant, j'ai besoin de créer ce type complexe dans la section "Arranger" de mon test d'unité afin que je puisse le nourrir à la méthode buggy dans la section "Act" du test unitaire.Débogueur Visualizer pour générer le code Initialisateur d'objet

Je peux écrire un grand bloc de code objet initialiseur, à la main, comme le suivant:

var cats = 
    new List<Cat> 
     { 
      new Cat {Name = "Sylvester", Age = 8}, 
      new Cat {Name = "Whiskers", Age = 2} 
     }; 

ou même quelque chose comme ceci:

var cats = new List<Cat>(); 
var cat1 = new Cat(); 
cat1.Name = "Sylvester"; 
cat1.Age = 8; 
cats.Add(cat1); 
var cat2 = new Cat(); 
cat2.Name = "Whiskers"; 
cat2.Age = 2; 
cats.Add(cat2); 

Rien n'y fantaisie. Le seul problème est la partie "à la main" - le type complexe dans mon cas n'est pas aussi trivial que l'exemple ci-dessus.

Je peux également afficher l'objet, dans le débogueur, avec l'un des visualiseurs de débogage intégrés. J'ai donc pensé que j'écrirais un Visualizer Debugger personnalisé qui va générer le code d'initialisation de l'objet pour moi. Pour l'utiliser, je reproduis le problème dans le débogueur, j'ouvre la fenêtre QuickWatch et sélectionne mon visualiseur personnalisé.

Une autre option consisterait à écrire une implémentation de sérialisation personnalisée qui "sérialiserait" un bloc de code d'initialisation d'objet. Pour utiliser cela serait un peu plus difficile que de simplement tirer vers le haut de la fenêtre QuickWatch, mais cela pourrait fonctionner.

Avant d'aborder ce problème moi-même, quelqu'un a-t-il fait quelque chose comme ça? Mind partage un extrait de code? Ou est-ce que quelqu'un pourrait suggérer une autre approche?

P.S. Dans mon cas, le type de l'objet est une sous-classe d'une classe de base abstraite. je voulais juste le mentionner.

+0

Je sais que cette question a été posée en arrière mais je réponds simplement parce que je peux. Je l'ai implémenté juste pour mon usage personnel. Détails à http://mrvshah.wordpress.com/2011/10/06/debug-visualizer-convert-an-object-to-code/ Code source à https://github.com/mrvshah/CreateCodeDebugVisualizer –

Répondre

0

Ces suggestions ne vont pas fonctionner.Lire la première ligne:

Vous pouvez écrire un Visualiseur personnalisé pour un objet d'une classe gérée sauf pour objet ou un tableau.

http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

Il y a votre réponse. Si je lis correctement, il ne peut pas être implémenté via un visualiseur. Une sorte de lame.

+0

Vous êtes absolument correct. Je l'ai découvert seulement après avoir essayé d'implémenter le mien. À la fin, j'ai utilisé la fenêtre immédiate pendant le débogage pour appeler une méthode statique que j'avais écrite pour générer le code d'initialisation de l'objet (en passant en paramètre l'instance d'objet pour laquelle je voulais le code d'initialisation). Cela a fonctionné, mais n'était pas une solution Debugger Visualizer parfaitement emballée et réutilisable. : - ( –

0

Je ne connais aucune fonctionnalité/fonctionnalité existante qui offre le comportement que vous recherchez. Mais l'idée d'écrire un Visualizer pour générer le code d'un objet donné semble être bonne pour les types d'objets simples: ceux constitués de propriétés de types primitifs. Une fois que vous êtes au-delà, la tâche devient de plus en plus difficile.

Dans le visualiseur, vous aurez accès à l'objet en question et pourrez utiliser des astuces comme la réflexion pour atteindre les membres. Représenter la valeur d'un membre sous forme de code est facile pour les types primitifs: int, string, etc ... C'est beaucoup plus difficile pour les types non-primitifs car le processus devient récursif et vous devez considérer les cycles d'objets.

Si cela fonctionne pour vous est ici un rapide tutoriel sur Débogueur visualiseurs

Dans l'ensemble, il peut être plus facile de remettre simplement rédiger chaque scénario :(