2010-11-17 13 views
11

Mamy błąd do naprawienia, i jak każdy dobry praktyk TDD, chcę napisać test awarii, aby najpierw przedstawić błąd. Błąd jest w metodzie, która przyjmuje raczej złożony typ jako dane wejściowe. Błąd będzie odtwarzany tylko wtedy, gdy typ złożony ma określoną kombinację ustawionych wartości właściwości.Wizualizator Debuggera do generowania kodu inicjalizatora obiektów

Do tej pory powieliłem błąd i, w debugerze, można wyświetlić wartość czasu wykonywania złożonego typu. Teraz muszę utworzyć ten złożony typ w sekcji "Rozmieść" w moim teście jednostki, aby móc go podać do metody buggy w sekcji "Akt" testu jednostkowego.

mogę napisać wielki blok kodu obiektu initializer, ręcznie, takie jak na następujący:

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

lub nawet coś takiego:

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); 

nic nadzwyczajnego tam. Jedynym problemem jest część "odręczna" - złożony typ w moim przypadku nie jest tak banalny jak powyższy przykład.

Mogę również wyświetlać obiekt w debugerze z dowolnym wbudowanym wizualizerem debuggera. Pomyślałem więc, że napiszę niestandardowy wizualizator Debuggera, który wygeneruje dla mnie kod inicjalizacji obiektu. Aby go użyć, chciałbym odtworzyć problem w debugerze, wyświetlić okno QuickWatch i wybrać mój własny wizualizator.

Inną opcją byłoby napisanie niestandardowej implementacji serializacji, która "serializuje" blok kodu inicjalizacji obiektu. Używanie tego byłoby nieco trudniejsze niż tylko podciągnięcie okna QuickWatch, ale może to zadziałać.

Zanim sam sobie poradzę z tym problemem, ktoś zrobił coś takiego? Umysł udostępniający fragment kodu? Czy ktoś mógłby zaproponować inne podejście?

P.S. W moim przypadku typ obiektu jest podklasą abstrakcyjnej klasy bazowej. Chciałem tylko o tym wspomnieć.

+0

Wiem, że to pytanie zostało zadane z powrotem, ale odpowiadam tylko dlatego, że mogę. Zaimplementowałem to tylko na własny użytek. Szczegóły na http://mrvshah.wordpress.com/2011/10/06/debug-visualizer-convert-an-object-to-code/ Kod źródłowy na https://github.com/mrvshah/CreateCodeDebugVisalizer –

Odpowiedz

0

Te sugestie nie będą działać.Czytaj pierwszą linię:

Możesz napisać własny wizualizera do obiekt dowolnej klasy zarządzanej wyjątkiem dla obiektu lub Array.

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

Tam jest odpowiedź. Jeśli czytam poprawnie, nie można go zaimplementować za pomocą wizualizatora. Coś lamanego.

+0

You're absolutnie poprawne. Odkryłem to dopiero po próbie wdrożenia mojej. W końcu użyłem bezpośredniego okna podczas debugowania, aby wywołać metodę statyczną, którą napisałem, aby wygenerować kod inicjalizatora obiektu (przekazując jako parametr instancję obiektu, dla którego potrzebowałem kodu inicjalizatora). Udało się, ale nie było starannie zapakowanym, wielokrotnego użytku rozwiązaniem Debugger Visualizer. : - ( –

0

Nie znam żadnej istniejącej funkcji/funkcjonalności, która zapewnia zachowanie, którego szukasz. Ale pomysł napisania Visualizera do wygenerowania kodu dla danego obiektu wydaje się brzmieć dla prostych typów obiektów: składających się z właściwości typów pierwotnych. Po przekroczeniu tego zadania zadanie staje się coraz trudniejsze.

W wizualizatorze uzyskasz dostęp do danego obiektu i możesz użyć sztuczek takich jak odbicie, aby uzyskać dostęp do członków. Reprezentacja wartości elementu jako kodu jest łatwa w przypadku typów podstawowych: int, string itd. Jest to znacznie trudniejsze w przypadku typów nieprostych, ponieważ proces staje się rekursywny i trzeba wziąć pod uwagę cykle obiektów.

Jeśli to działa dla Ciebie oto szybkie tutorial Debugger wizualizacje

W sumie może to być łatwiej po prostu oddać napisać każdy scenariusz :(

Powiązane problemy