Frage

Ich versuche, einen Weg zu fälschen das Ergebnis einer Methode aus einer anderen Methode aufgerufen zu finden.

Ich habe eine „Loaddata“ Methode, die einen separaten Helfer ruft einige Daten zu bekommen und dann wird es transformieren (Ich bin interessiert das umgewandelte Ergebnis in Prüfung).

So habe ich Code wie folgt:

public class MyClass(){
  public void LoadData(){
    SomeProperty = Helper.GetSomeData();
 }
 public object SomeProperty {get;set;}
}

Ich möchte von der Helper.GetSomeData () -Methode ein bekanntes Ergebnis haben. Kann ich einen Mockframework verwenden (ich habe ziemlich begrenzte Erfahrung mit Rhino Mocks bekam aber bin für alles offen) ein erwartetes Ergebnis zu zwingen? Wenn ja, wie?

* Edit -. Ja zu erwarten, da ich nicht den Hack erreichen konnte ich wollte, ich habe eine bessere Art und Weise zu arbeiten, die Daten einzurichten

War es hilfreich?

Lösung

Soweit ich weiß, sollten Sie eine Schnittstelle oder eine Basis abstrakte Klasse für das Helper-Objekt erstellen. Mit Rhino Mocks können Sie dann den Wert zurückgeben Sie wollen.

Alternativ können Sie eine Überlastung für Loaddata hinzufügen, die die Daten übernimmt als Parameter, die Sie normalerweise aus dem Helper-Objekt abzurufen. Dies könnte auch einfacher sein.

Andere Tipps

Sie haben ein Problem gibt. Ich weiß nicht, ob ein vereinfachtes Szenario des Codes das ist, aber wenn der Helper-Klasse auf diese Weise verwendet wird, dann wird Ihr Code ist nicht prüfbar. Zunächst wird die Helper-Klasse direkt verwendet, so dass Sie auf kann es nicht mit einem Mock ersetzen . Zweitens sind Sie eine statische Methode aufrufen. Ich weiß nicht, über C #, aber in Java Sie kann nicht statische Methoden außer Kraft setzen .

Sie werden einige Umgestaltungen tun müssen, um ein Mock-Objekt mit einem Dummy GetSomeData () -Methode injizieren kann.

In dieser vereinfachten Version des Codes ist schwierig, Ihnen eine klare Antwort zu geben. Sie haben einige Optionen:

  • eine Schnittstelle für die Helper-Klasse erstellen und einen Weg für die Kunden bietet die Helfer Implementierung der MyClass Klasse zu injizieren. Aber wenn Helper ist nur wirklich eine Utility-Klasse gibt es nicht viel Sinn machen.
  • Erstellen Sie eine geschützte Methode in MyClass genannt getSomeData und machen es Helper.LoadSomeData nur nennen. Dann ersetzen Sie den Aufruf Helper.LoadSomeData in Loaddata mit für getSomeData. Jetzt können Sie die getSomeData Methode verspotten den Dummy-Wert zurückzukehren.

Passen Sie einfach eine Schnittstelle zu schaffen, um Hilfsklasse und injizieren sie über Verfahren. Dies kann Implementierungsdetails aus. Warum ein Kunde sollte eine Implementierung eines Nutzen bieten Klasse eine einfache Bedienung zu nennen? Dadurch wird die Komplexität von MyClass Kunden erhöhen.

Ich würde Umwandlung empfehlen, was man in so etwas wie diese:

public class MyClass()
{
    private IHelper _helper;

    public MyClass()
    {
        //Default constructor normal code would use.
        this._helper = new Helper();
    }

    public MyClass(IHelper helper)
    {
        if(helper == null)
        {
            throw new NullException(); //I forget the exact name but you get my drift ;)
        }
        this._helper = helper;
    }

    public void LoadData()
    {
        SomeProperty = this._helper.GetSomeData();
    }
    public object SomeProperty {get;set;}
}

Jetzt ist Ihre Klasse unterstützt, was als Dependency Injection bekannt ist. Auf diese Weise können Sie die Umsetzung der Hilfsklasse injizieren und es wird sichergestellt, dass Ihre Klasse nur an der Schnittstelle abhängen muss. Wenn Sie diese verspotten wissen Sie nur ein Mock erstellen, die die IHelper-Schnittstelle verwendet und gibt sie in die an den Konstruktor und Ihre Klasse wird das verwenden, als ob es die reale Helper-Klasse ist.

Nun, wenn Sie die Helper-Klasse als statische Klasse stecken verwenden, dann würde ich vorschlagen, dass Sie einen Proxy / Adapter-Muster verwenden und die statische Klasse mit einer anderen Klasse wickeln, die die IHelper Schnittstelle unterstützt (die Sie auch erstellen müssen ).

Wenn irgendwann wollen Sie nehmen einen Schritt weiter können Sie vollständig die Standard-Helper Umsetzung der überarbeiteten Klasse entfernen und verwenden IoC (Inversion of Control) Containern. Wenn thiis allerdings neu für Sie ist, würde ich empfehlen, zunächst über die Grundlagen der Fokussierung warum all dieser zusätzlichen Aufwand lohnt sich (es IMHO ist).

Ihre Unit-Tests so etwas wie dieser psuedo-Code aussehen:

public Amazing_Mocking_Test()
{
    //Mock object setup
    MockObject mockery = new MockObject();
    IHelper myMock = (IHelper)mockery.createMockObject<IHelper>();
    mockery.On(myMock).Expect("GetSomeData").WithNoArguments().Return(Anything);

    //The actual test
    MyClass testClass = new MyClass(myMock);
    testClass.LoadData();

    //Ensure the mock had all of it's expectations met.
    mockery.VerifyExpectations();
}

Fühlen Sie sich frei zu äußern, wenn Sie Fragen haben. (Übrigens habe ich keine Ahnung, ob dieser Code alle Werke, die ich es nur in meinem Browser eingegeben, ich veranschauliche hauptsächlich die Konzepte).

Sie können in Typemock Trenner aussehen soll, das kann „fake“ Methode aufruft, ohne dass Sie zwingen Sie Ihren Code Refactoring. Ich bin ein Entwickler in dieser Gesellschaft, aber die Lösung ist lebensfähig, wenn Sie wissen wollen, wählen nicht Ihr Design zu ändern (oder gezwungen es nicht für Testbarkeit zu ändern) es ist bei www.Typemock.com

Roy Blog: ISerializable.com

Ja, ein Mockframework ist genau das, was Sie suchen. Sie können aufzeichnen / arrangieren, wie Sie bestimmte verspottet aus / Stub-Klassen zurückkehren möchten.

Rhino Mocks, Typemock und Moq sind alle gute Möglichkeiten, dies zu tun.

Steven Walther Beitrag zur Verwendung von Rhino Mocks mir viel geholfen, wenn ich mit Rhino Mocks zuerst angefangen zu spielen.

Ich würde versuchen, so etwas wie folgt aus:

public class MyClass(){
  public void LoadData(IHelper helper){
    SomeProperty = helper.GetSomeData();
 }

Auf diese Weise können die Helfer-Klasse zum Beispiel MOQ spotten kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top