Frage

Ich versuche, eine Klasse zu Unit-Test, die viele interne Funktionen. Diese müssen natürlich Tests auch, aber meine Tests Projekt ist separat, vor allem, weil es viele kleine, Projekte abdeckt. Was ich habe, so weit ist:

FieldInfo[] _fields = 
    typeof(ButtonedForm.TitleButton).GetFields(
        BindingFlags.NonPublic | BindingFlags.Instance | 
        BindingFlags.DeclaredOnly);
Console.WriteLine("{0} fields:", _fields.Length);
foreach (FieldInfo fi in _fields)
{
    Console.WriteLine(fi.Name);
}

Dieser spuckt alle privaten Mitglieder schön, aber immer noch Einbauten nicht angezeigt. Ich weiß, dass dies möglich ist, weil, als ich um mit den automatisch generierten Tests durcheinander, dass Visual Studio produzieren kann, es geht um etwas gebeten, mit der Anzeige Interna auf den Prüfstand Projekt zu tun. Nun, jetzt ist ich mit NUnit und wirklich mag es, aber wie kann ich das Gleiche mit ihr erreichen?

War es hilfreich?

Lösung

Es wäre sinnvoller sein, die InternalsVisibleTo zu verwenden Attribut Zugriff auf die internen Mitglieder der Versammlung auf das Gerät Testanordnung zu gewähren.

Hier ist ein Link mit hilfreichen Zusatzinfos und ein Spaziergang durch:

Zur Beantwortung tatsächlich Ihre Frage ... Interne und geschützt sind, in dem .NET-Reflection-API nicht erkannt. Hier ist ein Zitat aus MSDN :

  

Die C # Schlüsselwörter geschützt und interne haben keine Bedeutung in IL und sind nicht in dem Reflection-APIs verwendet. Die entsprechenden Begriffe in IL sind Familie und Montage. Zur Identifizierung eines internen Verfahren unter Verwendung von Reflexion, verwenden Sie die IsAssembly Eigenschaft. Zur Identifizierung eines geschützten internen Verfahren, verwenden Sie die IsFamilyOrAssembly .

Andere Tipps

Das Hinzufügen der InternalsVisibleTo Baugruppenebene Attribut zu Ihrem Hauptprojekt, mit der Versammlung Namen dre Testprojekt sollte interne Mitglieder sichtbar machen.

Zum Beispiel fügen Sie die folgende in der Montage außerhalb jeder Klasse:

[assembly: InternalsVisibleTo("AssemblyB")]

oder für eine spezifischere Ausrichtung:

[assembly:InternalsVisibleTo("AssemblyB, PublicKey=32ab4ba45e0a69a1")]

Beachten Sie, wenn Ihre Anwendung Assembly einen starken Namen hat, wird Ihre Testanordnung müssen auch stark benannt werden.

Ich glaube, Sie müssen fragen, ob Sie Unit-Tests für private Methoden schreiben sollte? Wenn Sie Unit-Tests für Ihre öffentlichen Methoden zu schreiben, mit einer ‚vernünftigen‘ Code-Coverage, die nicht bereits alle private Methoden zu testen, die als Folge genannt werden?

Binden Tests an private Methoden werden die Tests brüchiger machen. Sie sollten die Implementierung einer privaten Methoden zu ändern, ohne zu brechen alle Tests in der Lage sein.

Refs:

http://weblogs.asp.net/tgraham/ Archiv / 2003/12/31 / 46984.aspx http://richardsbraindump.blogspot.com/2008 /08/should-i-unit-test-private-methods.html http://junit.sourceforge.net/doc/faq/faq.htm#tests_11 http://geekswithblogs.net/geekusconlivus/archive/2006/07/13 /85088.aspx

Ihr Code nur Felder zeigt - so würde ich hoffe, dass es keine internen Mitglieder zeigen würde, wie Felder immer IMO privat sein sollten. (Mit der potentiellen Ausnahme von Konstanten.)

Hat ButtonedForm.TitleButton eigentlich alle nicht privaten Felder? Wenn Sie versuchen, interne Methoden finden dann natürlich müssen Sie GetMethods (oder GetMembers) zu rufen, sie zu erhalten.

Wie andere vorgeschlagen haben, ist InternalsVisibleTo sehr praktisch für die Prüfung (und fast ausschließlich zum Testen!). Als ob Sie interne Methoden testen sollten - ich finde es sicherlich nützlich Lage sein, dies zu tun. Ich halte nicht Unit-Tests als ausschließlich Black-Box-Tests. Oft, wenn Sie wissen, dass die öffentliche Funktionalität ist ein paar internen Methoden in einfacher Weise verbunden implementiert, ist es einfacher, gründliche Prüfung jedes der internen Methoden und einig „pseudo-Integration“ Tests auf dem öffentlichen Verfahren zu tun.

Eine Begründung der InternalsVisible für die Verwendung ist unter meinen Umständen. Wir kaufen den Quellcode zu einem Chart Control. Wir haben herausgefunden, wo wir einige Änderungen an dieser Quelle Kontrolle vornehmen müssen und unsere eigene Version kompilieren. Nun, um sicherzustellen, wir haben nichts zu brechen, gibt es einige Unit-Tests Ich brauche diese Notwendigkeit, den Zugang zu einigen internen Feldern zu schreiben.

Dies ist ein perfekter Fall, in dem die InternalsVisible Sinn macht.

Ich frage mich aber, was tun Sie, wenn Sie keinen Zugriff auf die Quelle haben? Wie könnten Sie auf ein internes Feld bekommen? NET Reflector, dass Code sehen, aber ich denke, es ist nur an der IL suchen.

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