Frage

Ich habe eine Klasse mit komplexen wissenschaftlichen Berechnungen. Es ist so eingerichtet, dass nur einem Benutzer einen ordnungsgemäß instanziierten Fall erstellt werden kann. Um den Code ordnungsgemäß zu testen, muss jedoch die variablen staatlichen Variablen direkt festgelegt werden, da die Referenzdokumente diese Daten in ihren Testfällen liefern. Falsch gemacht, kann es den Staat ungültig machen.

Daher muss ich die Fähigkeit haben, eine Mitgliedsfunktion, interne Variablen aus den Einheitstestprogrammen festzulegen. Aber ich will stark entmutigen Normale Benutzer von dieser Funktion aufrufen. (Ja, ein entschlossener Benutzer kann mit irgendetwas muken ... aber ich will nicht werben dass es eine Möglichkeit gibt, etwas zu tun falsch.)

Es wäre schön, intellisese zu sagen, dass er beispielsweise die Funktion nicht zeigen würde.

Die beste Lösung, die ich im Moment habe, ist, die Funktion so etwas wie: gefährlich () zu benennen.

Welche anderen Optionen habe ich?

Nachverfolgen

Ich fand die Antwort von David B für meine Situation am nützlichsten. Vielen Dank!
Mufasas Vorschlag, Reflexion zu verwenden, war großartig, aber schwerer zu implementieren (für mich).
Chris 'Vorschlag, einen Dekorateur zu verwenden, war gut, aber nicht ausgestattet.
Bfrees Vorschlag zu XML ist ebenfalls gut und wurde bereits verwendet, löst das Problem aber nicht wirklich.

Schließlich ist Billthelizards Vorschlag, dass das Problem in den Quelldokumenten liegt, nicht etwas, was ich kontrollieren kann. Internationale Experten veröffentlichen hochtechnische Bücher und Zeitschriftenartikel für die Verwendung ihrer Community. Die Tatsache, dass sie meine besonderen Bedürfnisse nicht ansprechen, ist eine Tatsache des Lebens. Es gibt einfach keine alternativen Dokumente.

War es hilfreich?

Lösung

Angenommen, Sie möchten dieses Objekt testen, indem Sie seine Felder manipulieren.

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

Platzieren Sie dieses Objekt in Ihre Testbaugruppe/Ihren Namespace:

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

Und schreiben Sie Ihren Test:

    public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

PS: Ich weiß, dass du gesagt hast intern, aber ich glaube nicht, dass du meinst intern.

Andere Tipps

Sie können verwenden InternalSvisibletoatTribute Um interne Mitglieder als sichtbar für Ihre Testbaugruppe zu markieren. Es scheint zu glänzen, wenn es in diesem Zusammenhang verwendet wird, obwohl es nicht ganz "Freund" ist.

  1. Markieren Sie Ihre DangerousSet Funktion internal Anstatt von public.

  2. In Eigenschaften AssemblyInfo.cs des Projekts enthält DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

Wenn Sie aus irgendeinem Grund zwei Testbaugruppen haben, lautet die Syntax:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

Dekorieren Sie Ihre Methode mit diesem Attribut:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

Dies wird es vor Intellisense verbergen.

BEARBEITEN:

Aber anscheinend hat dies eine ziemlich bedeutende Einschränkung: "In visueller C#,, EditorBrowsableAttribute unterdrückt keine Mitglieder einer Klasse in derselben Versammlung. " Über MSDN.

Es klingt so, als ob Ihr wirkliches Problem in Ihren Referenzdokumenten liegt. Sie sollten keine Fälle testen, die bei ordnungsgemäßer Verwendung Ihrer Klasse unmöglich zu begegnen sind. Wenn Benutzer den Zustand dieser Variablen nicht ändern dürfen, sollten Ihre Tests auch nicht.

Sie können auch Reflexion verwenden. Die Google -Suche wurde aufgetaucht Einheitstests private Methoden unter Verwendung von Reflexion.

Kann Ihr Testcode eine Unterklasse der Berechnungsklasse enthalten? Wenn ja, können Sie die Funktion markieren protected und nur Erbsperrer können es verwenden. Ich bin mir ziemlich sicher, dass dies auch aus Intellisense herausnimmt, aber ich könnte mich darüber irren.

Was ich in der Vergangenheit getan habe, ist, dass ich XML -Kommentare nach der Methode einsetzte und den Abschnitt verwendet habe, um in großen, kräftigen Buchstaben zu schreiben. Verwenden Sie diese Methode nicht oder was auch immer. Auf diese Weise würde Intellisense, wenn jemand versuchte, es zu benutzen, eine nette Warnung.

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