2011-01-07 11 views
3

Ich habe eine Klasse ähnlich den folgenden:C#: Wie Unit-Test eine Methode, die auf einer anderen Methode innerhalb der gleichen Klasse beruht?

public class MyProxy : ClientBase<IService>, IService 
{ 
    public MyProxy(String endpointConfiguration) : 
     base(endpointConfiguration) { } 

    public int DoSomething(int x) 
    { 
     int result = DoSomethingToX(x); //This passes unit testing 

     int result2 = ((IService)this).DoWork(x) 

     //do I have to extract this part into a separate method just 
     //to test it even though it's only a couple of lines? 
     //Do something on result2 
     int result3 = result2 ... 

     return result3; 
    } 

    int IService.DoWork(int x) 
    { 
     return base.Channel.DoWork(x); 
    } 
} 

Das Problem liegt in der Tatsache, dass, wenn ich nicht weiß, zu testen, wie der result2 Artikel verspotten, ohne das Teil zu extrahieren, die result3 result2 in eine separaten Verwendung bekommt Methode. Und weil es Unit-Testing ist, möchte ich nicht so tief gehen, um zu testen, was result2 als ... zurückkommt. Ich würde die Daten eher irgendwie vortäuschen ... wie, die Funktion aufrufen und genau das ersetzen können ein Anruf.

Antwort

1

Sie wie folgt:

eine IService Eigenschaft einrichten wie:

public IService MyService { get; set; }

Dann können Sie tun: int result2 = MyService.DoWork(x) solange irgendwo im Konstruktor oder was auch immer Sie setzen MyService = this;

Wenn Sie die Eigenschaft nicht verfügbar machen möchten, können Sie sie als privat festlegen oder was auch immer, und sie mit Accessoren testen.

+0

Das hat funktioniert! Vielen Dank! Jetzt, um es sauberer und privater zu machen. – michael

2

Sie können das nicht wirklich tun. Sie haben drei Möglichkeiten:

  • Subclass MyProxy und außer Kraft setzen DoWork, die einige Hantieren erfordert die Compiler
  • Mock die Kanaleigenschaft, zu gefallen, die erfordern, dass es in der Basisklasse
  • Verschieben einstellbar ist DoWork in eine andere Klasse, übergeben Sie den Kanal im Konstruktor, und spotten Sie das in Ihren Tests
3

Haben Sie eine Vorliebe für Spott Frameworks?

Die Partial Mock Funktion in Rhino Mocks scheint wie es tun soll, was Sie wollen.

+0

Ja, ich glaube, dass partielle Spott den Trick machen wird. –

+0

Ich hatte gehofft, das integrierte Microsoft Testing Framework zu verwenden, aber es scheint, dass das keine Lösung ist. Ich hoffe wirklich, etwas zu vermeiden, was über Visual Studio Ultimate hinausgeht. – michael

+0

Ich bin neugierig, hast du einen Grund, Dinge zu vermeiden, die über das hinausgehen, was in Studio gebaut wird? Welche Version von Studio verwenden Sie? –

0

Sie können es tun, indem sie neueste Microsoft Research Projekt Moles

mit Sobald Sie es zum Laufen bringen, Sie

MMyProxy.DoWork32 =() => put your mock result here. 

Denken Sie daran, folgendes tun moleBehavior eingestellt für die unmocked Methoden durchsturz.

0

Ich glaube, dass Sie ein Design-Problem hier haben, sollte Ihre IService.DoWork höchstwahrscheinlich in einer anderen Klasse leben, es sieht aus wie nur ein dünner Wrapper auf etwas anderes. Haben Sie darüber nachgedacht, es zu refaktorisieren?

Dann, wenn es in einer anderen Klasse lebt, brauchen Sie keine besondere Behandlung für Spott.

Verwandte Themen