Testing und mocking private/protected-Methoden. Viele Beiträge aber noch nicht machen, ein Beispiel der Arbeit
Ich habe gesehen, viele Beiträge und Fragen über "die Verspottung einer privaten Methode" ist aber immer noch nicht seine Arbeit machen und nicht eine wirkliche Antwort.
Lässt den code vergessen Geruch und Sie sollten es nicht tun etc....
Aus, was ich verstehe, habe ich Folgendes getan:
1) Erstellt eine Klasse Bibliothek "MyMoqSamples"
2) Hinzugefügt ref Moq und NUnit
3) Bearbeitet die Datei AssemblyInfo und das Hinzugefügt
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("MyMoqSamples")]
4) Jetzt testen müssen, die eine private Methode.Da es eine private Methode ist es nicht Teil einer Schnittstelle.
5) folgenden code Hinzugefügt
[TestFixture]
public class Can_test_my_private_method
{
[Test]
public void Should_be_able_to_test_my_private_method()
{
//TODO how do I test my DoSomthing method?
}
}
public class CustomerInfo
{
public string Name { get; set; }
public string Surname { get; set; }
}
public interface ICustomerService
{
List<CustomerInfo> GetCustomers();
}
public class CustomerService : ICustomerService
{
public List<CustomerInfo> GetCustomers()
{
return new List<CustomerInfo> { new CustomerInfo { Surname = "Bloggs", Name = "Jo" } };
}
protected virtual void DoSomething()
{
}
}
Könnten Sie mir ein Beispiel, wie würden Sie testen, meine private Methode?
Vielen Dank
InformationsquelleAutor user9969 | 2010-06-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Schritte die du beschreibst set Moq bis zu test-internen Klassen und Mitgliedern, so haben Sie wirklich nichts zu tun mit der Prüfung einer geschützten oder privaten Methode
Testen von privaten Methoden ist ein bisschen ein Geruch, sollte wirklich test nur die öffentliche API. Wenn Sie glauben, dass die Methode ist wirklich wichtig und muss isoliert getestet werden es vielleicht verdient zu werden in seiner eigenen Klasse, wo es kann dann getestet werden, auf Ihre eigenen?
Wenn Ihr Herz ist auf die Prüfung der protected-Methode, die oben, können Sie Rollen Sie Ihre eigenen Mock in Ihrer test-Montage:
Wenn es privat könnte Sie wahrscheinlich etwas heftig, mit Reflexion aber, die route ist der Weg zum testen der Hölle.
Update
Während Sie gegeben haben Beispiel-code in deiner Frage sehe ich nicht wirklich, wie Sie wollen, um zu "testen", die geschützte Methode, so werde ich kommen mit etwas gekünstelt...
Lets sagen, dass Ihre Kunden-service sieht wie folgt aus:-
Wenn Sie testen wollten, die protected-Methode können Sie nur so etwas wie:-
Den Namen dieses "Muster" ist das Testen von bestimmten Unterklasse (basierend auf xUnit test patterns-Terminologie) für weitere Informationen möchten Sie vielleicht hier zu sehen:-
http://xunitpatterns.com/Test-Specific%20Subclass.html
Basierend auf Ihre Kommentare und die Vorherige Frage, wie es scheint, haben Sie beauftragt, die Implementierung der unit-tests auf, dass einige legacy-code (oder aus der Entscheidung selbst). In dem Fall die Bibel aller Dinge legacy code ist das Buch von Michael Feathers. Es umfasst Techniken wie das vorliegende als auch für refactorings und Techniken zu befassen sich mit brechen "nicht testbar" Klassen und Methoden, die in etwas mehr überschaubar und ich kann es nur wärmstens empfehlen.
Es ist möglich zu testen, eine interne Klasse durch das InternalsVisibleTo-Attribut, wie Sie beschrieben, am Anfang deiner Frage.
Kommissionierung bis auf den rest der Frage. Die tiefere Frage ist, warum Sie möchten, um zu testen, ein eigenes Mitglied in den ersten Platz, und warum willst du Moq, es zu tun?
Ich persönlich finde Moq nützlich für die Isolierung von Abhängigkeiten beim testen einer Klasse, die hängt davon ab, ICustomerService. Was Sie scheinen zu Fragen ist, wie zu testen die Durchführung von ICustomerService und darüber hinaus die Injektion von Abhängigkeiten, die der Dienst möglicherweise hängt ab, ich bin mir nicht wirklich sicher, wie Moq, können Ihnen helfen, dies tun.
Stattdessen versuchen Sie, und testen Sie die öffentlichen API, wenn Sie möchten, um zu testen, ob die protected-Methode aufgerufen wird, während die API-Aufruf, der ist einfach genug zu tun, indem bilden von Unterklassen CustomerService in den test-code.
InformationsquelleAutor John Foster
Gibt es anscheinend zwei Teile zu Ihrer Frage.
Wie kann ich simulieren Sie eine protected-Methode:
http://blogs.clariusconsulting.net/kzu/mocking-protected-members-with-moq/
wie kann ich trigger den Aufruf dieser protected/private Verhalten in meinem test
Hier ist die Antwort, die Sie auslösen, über etwas öffentlich zugänglich. Wenn Sie erzwingen möchten, dass es geschehen direkt (d.h., eigentlich invoke etwas
protected
direkt ohne einen zwischengeschalteten Helfer, die Sie brauchen Reflexion. Das ist by design - die Sprachen sind die Bereitstellung der Schutz-Mechanismen als einen Weg der Durchsetzung der Kapselung.Ich schlage vor, Sie denken über, was Sie versuchen zu zeigen/beweisen in Ihren test aber. Wenn Sie finden, sich selbst das schreiben einer test-das ist kompliziert, du Machst Es Falsch. Vielleicht das, was Sie tun möchten, können aufgegliedert werden in unabhängigen tests? Vielleicht sind Sie schreiben ein integration-test, nicht um einen unit-test? Aber es gibt viele Artikel draußen auf schlechte tests, und mehr machen Sinn, wenn Sie lernen, zu schreiben von tests. Zwei meiner Favoriten sind http://www.codethinked.com/post/2009/06/30/What-is-Unit-Testing.aspx und http://www.codethinked.com/post/2009/11/05/Ite28099s-Okay-To-Write-Unit-Tests.aspx
diese links sind sehr sehr gut! Ich mag Sie, ich könnte Sie weiterleiten.(Zu Hilfe, mein Fall)
Ruben, wie gesagt, wenn umgestalten, diese internen Methoden und machen Sie der öffentlichkeit und in der internen Klasse werde ich in der gleichen position? Nur versuchen zu denken, von Problemumgehungen, die sind keine "hacks"
Basierend auf Ihr Gespräch mit @sighohwell... Du öbv setzen wollen, Effektiv zu Arbeiten Mit Legacy Code auf Ihrer Lesung-Liste zu. Aber meine Wette ist, dass Sie finden xUnit Test Patterns am nützlichsten von allen - Sie haben die grundlegenden mechanischen Verständnis aber brauchen nur binden Sie es alle zusammen
BTW ich habe gerade +1d @sighohwell Antwort. Ihre Art der Fütterung wieder auf Menschen, die Sie betrachten, Ihnen zu helfen ist, indem Sie +1ing. Blick auf den Aufwand, den er/Sie bei dem Versuch, um Punkte über.
InformationsquelleAutor Ruben Bartelink