Verwenden privater Accessoren
Aktualisiert: November 2007
Da nur Methoden in der Aufrufhierarchie auf private oder interne Methoden mit zu testendem Code zugreifen können, benötigen Testmethoden private Accessoren für den indirekten Aufruf dieses zugriffsbeschränkten Codes.
Ein privater Accessor ist eine Assembly, die Shadowimplementierungen aller Methoden der Assembly mit dem getesteten Code enthält. Jede Methode im privaten Accessor ist öffentlich und verwendet den Namen der entsprechenden Methode im getesteten Code. Durch den Aufruf einer Methode im privaten Accessor wird die private Methode des getesteten Codes aufgerufen. Dies erleichtert den Zugriff auf Code, der über den private-Zugriffsqualifizierer verfügt.
Hinweis: |
---|
Der private Accessor ermöglicht den Tests auch den Zugriff auf private Variablen im getesteten Code. |
Ein privater Accessor ist eine kompilierte Assembly im Ordner Testverweise des Projektmappen-Explorers. Sie hat den Namen <assembly_name>.private_accessor, wobei <assembly_name> dem Assemblynamen entspricht, der in den Projekteigenschaften angegeben ist.
Hinweis: |
---|
Weitere Informationen zum Testen von Elementen, die über den internal-Zugriffsqualifizierer verfügen, finden Sie unter Festlegen des InternalsVisibleTo-Attributs. |
Erstellen von privaten Accessoren
Wenn Sie einen Komponententest für eine private Methode generieren, wird in Visual Studio automatisch ein privater Accessor erstellt, sofern das Testprojekt noch keinen privaten Accessor enthält.
Während der Erstellung der Projektmappe werden die Verweise im privaten Accessor aktualisiert. Daher sollten Sie eine Neukompilierung durchführen, nachdem Sie den Produktionscode geändert haben, um den privaten Accessor entsprechend zu aktualisieren.
Informationen zum Generieren eines privaten Accessors finden Sie unter Gewusst wie: Testen einer privaten Methode.
Manuelles Erstellen von privaten Accessoren
Falls für die getestete Assembly kein privater Accessor vorhanden ist, können Sie einen Accessor generieren, ohne dass Testmethoden generiert werden müssen.
Um einen neuen privaten Accessor zu erstellen oder einen gelöschten privaten Accessor neu zu erstellen, klicken Sie mit der rechten Maustaste in den zu testenden Code. Klicken Sie als Nächstes im Kontextmenü auf Privaten Accessor erstellen, und wählen Sie anschließend das Testprojekt aus, in das die Assembly mit dem privaten Accessor eingefügt werden soll. Dieses Menüelement wird nicht angezeigt, wenn die Projektmappe kein Testprojekt enthält.
Hinweis: |
---|
Mit dem Dienstprogramm publicize können Sie auch einen privaten Accessor über eine Eingabeaufforderung erstellen. |
Verwenden privater Accessoren
Um privaten Code zu testen, erstellen Sie zuerst den privaten Accessor, wie in Gewusst wie: Testen einer privaten Methode beschrieben. Anschließend muss der Test das Objekt instanziieren, das auf die private Methode zugreift, bevor die eigentlichen Testschritte ausgeführt werden.
Beispiel: Der Produktionscode enthält die folgende Methode in der BankAccount-Klasse:
private void FreezeAccount()
{
m_frozen = true;
}
Mit der folgenden Testmethode wird die private FreezeAccount()-Methode getestet. Für den Zugriff auf die FreezeAccount()-Methode muss die Testmethode zuerst das BankAccount_Accessor-Objekt in der Assembly mit dem privaten Accessor instanziieren. Dies ist erforderlich, da BankAccount_Accessor die Shadowimplementierung von FreezeAccount() enthält, d. h. der Methode, die Sie testen möchten. Im folgenden Code wird FreezeAccount() durch die Shadowimplementierung des privaten Accessors aufgerufen.
Der folgende Beispielcode wurde automatisch generiert und dann von der Person bearbeitet, die den Test erstellt hat. Die TODO-Anweisungen weisen auf Anweisungen im Testcode hin, die vor Ausführung des Tests manuell ausgeführt werden müssen.
[TestMethod()]
public void FreezeAccountTest()
{
BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
target.FreezeAccount();
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
bool creditAccount = false; // False means account could be credited: Fail test.
// Try to credit account
try
{
target.Credit(1.00);
}
catch (System.Exception)
{
// Threw exception. FreezeAccount worked correctly: Pass test.
creditAccount = true;
}
// Assert fails if 'creditAccount' condition is false. Fail test.
Assert.IsTrue(creditAccount, "Was able to credit account.");
}
Dieses Beispiel wird in Exemplarische Vorgehensweise: Erstellen und Ausführen von Komponententests in weiteren Details behandelt.