Wie zu Verspotten (mit Moq) Einheit Methoden
Erweiterung Methoden sind nicht gut für die Prüfung (das ist hier beschrieben: Spöttische Erweiterung Methoden mit Moq, http://www.clariusconsulting.net/blogs/kzu/archive/2009/12/22/Howtomockextensionmethods.aspx).
Aber wahrscheinlich gibt es einige Lösungen für Spott der Einheit Methoden? In meinem Fall habe ich die folgende Funktion:
public class MyManager
{
public MyManager(IUnityContainer container) : base(container) { }
public IResult DoJob(IData data)
{
IMyLog log = MyContainer.Resolve<IMyLog>();
... use log.Id ...
MyContainer.Resolve<...>();//usage for other purposes...
}
Ich möchte sicher sein, dass 'DoJob-Methode", wird immer wieder 'IMyLog' - Objekt aus dem container, aber nicht aus anderen Quellen... wie könnte ich das testen?
Meine ursprüngliche Idee war, zu ändern 'DoJob-Methode" Implementierung und Nutzung:
IMyLog log = UnityContainer.Resolve(typeof(IMyLog)) as IMyLog;
Aber "Beheben(Typ t,...),' ist auch eine Erweiterung Methode...
Irgendwelche Gedanken sind willkommen.
P. S. Bitte beachten Sie, dass "meine log' - Objekt erstellt, weit Weg von MyManager.DoJob...
InformationsquelleAutor Budda | 2010-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entfernen Sie die Abhängigkeit von IUnityContainer und die Dinge werden viel einfacher und sauberer. Stattdessen lassen Sie die Einheit Spritzen Sie Ihre Abhängigkeiten, die sich abstrahiert in Schnittstellen. Diese sind leicht verspottet. Hier ist ein Beispiel mit einem kleinen trick mit der Einheit, die injiziert eine auto-Fabrik für IMyLog.
Oder wenn Sie nicht brauchen, um die Instanz erstellen jedes mal:
InformationsquelleAutor TheCodeKing
Ich weiß, ich bin spät zur party, aber ich hatte das gleiche problem und gelöst von mocking folgende Methode -
Beispielsweise -
Nur für den Fall, jemand Bedürfnisse zu verspotten und können nicht entfernen Sie die Abhängigkeit auf den container.
InformationsquelleAutor evilbhonda
Denke, ich fand am besten geeignete Lösung für den test: Es ist nicht notwendig, zu verspotten unity-container und prüfe ob der 'melden' - Objekt wurde von Ihr genommen. Ich Mach mir ein mock für den 'Log' - Objekt, registrieren Sie Ihre Objekt-Instanz in den Behälter und prüfen im test, ob dieses log-Objekt tatsächlich genutzt wird.
Dies zu tun, was erforderlich ist.
Dank.
InformationsquelleAutor Budda
ich Stimme mit beiden Antworten. TheCodeKing, es ist völlig legitim zu verwenden IoC-interface direkt. Ein Beispiel könnte ein controller factory in ASP.NET Projekt - wo man machen könnte, nicht-triviale Auflösung mit mehreren Methoden aufIUnityContainer
- Schnittstelle.Hmm... mit auto-Fabrik Injektion labdas, hat man nie zu unit-test der IoC-interface direkt. Sie könnten nur pass ein lambda-Ausdruck und stellen Sie sicher, dass es aufgerufen wird, mit den richtigen Parametern.
Budda, sollten Sie nie bringen in einem IoC-container in das Gerät zu testen. Die Abhängigkeiten injiziert werden muss manuell.
Unten ist die Lösung, die ich verwenden. Ich habe quasi eine Abstraktionsebene über
IUnityContainer
und implementiert eine einfache Klasse, die Delegierten zuIUnityContainer
. Da mein interface nicht enthalten, Verlängerung Methoden,, ich kann leicht spotten.Jetzt, schreiben Sie Ihre Klasse
IDIContainer
:Neu zu schreiben und den unit-test wie folgt:
Igor, vielen Dank, es ist eine wirklich gute Lösung. Danke!
Nur re-Lesen Sie Ihre post. Ich wusste nicht, über die auto-Fabrik unterstützen. Gepaart mit
InjectionFactory
Sie konnten sich nicht brauchen, um zu injizieren, die container. Ich nehme alles zurück 🙂Ich sehe nicht ein Problem mit der Verwendung einer test-konfiguriert IoC-container in unit-tests, aber die meisten der Zeit tun, so einfach stellt Komplexität. Wie Sie vorschlagen, würde ich verwenden Sie die manuelle Injektion (in tests, nicht die Produktion-code) 90% der Zeit.
InformationsquelleAutor Igor Zevaka