Test Aufrufe von privaten Methoden mit moq
Habe ich folgende Methode, die ich zum test mit Moq. Das problem ist, dass jede Methode aufgerufen, in der switch-Anweisung ist private, einschließlich der PublishMessage am Ende. Aber diese Methode (ProcessMessage) ist öffentlich. Wie kann ich testen, so dass ich sicherstellen kann, dass die Aufrufe in Abhängigkeit der parameter? Beachten Sie, dass ich nicht die Prüfung der privaten Methoden, auf die ich nur testen will, dem "ruft". Ich möchte mock diese privaten Methoden und prüfen Sie, ob Sie genannt werden mithilfe von Setup, aber Moq nicht unterstützt Spott private Methoden.
public void ProcessMessage(DispenserMessageDataContract dispenserMessage)
{
var transOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, transOptions))
{
switch (dispenserMessage.Type)
{
case DispenserMessageType.AckNack:
UpdateAckNackMessageQueue(dispenserMessage);
break;
case DispenserMessageType.FillRequest:
CreateFillRequestMessageQueue(dispenserMessage);
break;
case DispenserMessageType.FillEvent:
UpdateFillEventMessageQueue(dispenserMessage);
break;
case DispenserMessageType.RequestInventory:
CreateRequestInventoryMessageQueue(dispenserMessage);
break;
case DispenserMessageType.ReceiveInventory:
CreateReceiveInventoryMessageQueue(dispenserMessage);
break;
}
scope.Complete();
}
PublishMessage(dispenserMessage);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ändern diese privaten Methoden, um atleast geschützte virtuelle um Sie zu verhöhnen, und verwenden Sie dann spotten.Geschützt, um Sie zu verhöhnen(http://blogs.clariusconsulting.net/kzu/mocking-protected-members-with-moq/). Sie können nicht verspotten private Methoden.
Moq (und einigen anderen frameworks) verwendet Burg Projekts DynamicProxy auf "generate proxies" on-the-fly zur Laufzeit, so dass Mitglieder ein Objekt abgefangen werden können ohne änderungen am code der Klasse. Überwachung nur auf die öffentlichen-virtuellen und virtuellen geschützten Methoden.
Siehe URL unten für weitere Informationen:
http://www.castleproject.org/projects/dynamicproxy/
Ziehen Sie die private Methode in eine andere Klasse und Sie publik machen, dann verspotten Sie diejenigen, die mit Moq und stellen Sie sicher, dass Sie aufgerufen wurden.
Moq ist für Spott Eigenschaften und Methoden deklariert und Schnittstellen oder abstrakten Eigenschaften und Methoden in Klassen.
Die Idee hinter Moq-Tests ist, dass Sie testen die Interaktionen zwischen der class-under-test und dem rest der Welt (dessen Abhängigkeiten). Moq tut dies durch die Schaffung eines "verspottet" Implementierung der Schnittstelle oder eine Ableitung von der abstrakten Klasse mit abstrakten Methoden implementiert.
Moq nicht überschreiben, vorhandene Implementierung wie private Methoden. Dies ist nicht, wie Moq funktioniert.
Entweder sollten Sie testen, "ProcessMessage" mit allen möglichen input und erwarteten output-oder sollten Sie überarbeiten Sie Ihre Klasse zu delegieren, die Aufrufe von interface-Methoden, die Sie können mock mit Moq. Testen von privaten Methoden ist ein schlechtes Konzept sowieso. Sie werden privat gehalten, für einen Grund, sich zu verstecken der Implementierung, so dass es nach Wunsch ändern kann.
Stell ich lieber zusätzliche Klasse (*Helfer) und bewegen sich auf allen meinen privaten Methoden zur öffentlichkeit. Dann können Sie leicht testen Sie Ihre Methoden direkt. Ich finde nicht, elegantere Art und Weise zu tun.
In einigen Fällen müssen Sie möglicherweise ändern, um das Verhalten der privaten Methode innerhalb der Klasse, die Sie unit-Tests. Sie müssen simulieren diese private Methode und stellen Sie es zurück, was für den jeweiligen Fall. Da diese private Methode innerhalb Ihrer Klasse unter test, dann spottet es ist wenig spezifisch. Verwenden Sie spy-Objekt.
Spy-Objekt
Ein Spion ist ein echtes Objekt, das mocking framework zugreifen kann. Ausspioniert-Objekte werden teilweise verspottet Objekte. Einige Ihrer Methoden sind echt einige verspottet. Ich würde sagen, verwenden Sie spy-Objekt mit großer Vorsicht, weil man nicht wirklich weiß, was Los ist unter und ob Sie wirklich testen Sie Ihre Klasse oder verspottet version.
Dann werden Sie verhöhnen die Spy-Objekt
Hoffe, dass wird Ihnen helfen,
Die besten Wünsche