Wie tun Sie Unit-Test-Code, der mit interagiert und COM-Objekte von Drittanbietern instanziiert?

StackOverflow https://stackoverflow.com/questions/70482

Frage

Eines der größten Probleme zur Zeit mich wieder vom Tauchen mit Volldampf in der Unit-Tests halten, ist, dass ein wirklich großer Prozentsatz des Code, den ich schreibe auf fremde COM-Objekte aus verschiedenen Quellen stark abhängig ist, die auch miteinander zu interagieren neigen (ich schreibe Add-In für Microsoft Office mehrere Hilfsbibliotheken zu verwenden, wenn Sie wissen müssen).

Ich weiß, dass ich wahrscheinlich Mock-Objekte verwenden soll, aber wie genau würde ich mich über die in diesem Fall? Ich kann sehen, dass es relativ einfach ist, wenn ich nur noch einen Verweis auf ein bereits bestehendes Objekt übergeben, aber einige meine Routinen instanziiert externe COM-Objekte selbst und sie dann manchmal von noch einer anderen Bibliothek zu einem anderen externen COM-Objekt weitergeben.

Was ist der Best-Practice-Ansatz hier? Sollte ich vorübergehend meinen Tests Code der COM-Registrierungsinformationen in der Registrierung ändern, so dass die getesteten Code eines meiner Mock-Objekte statt instanziiert wird? Sollte ich spritze Typbibliothek Einheiten geändert? Welche anderen Ansätze gibt es?

Ich wäre besonders dankbar für Beispiele oder Werkzeuge für Delphi würde aber mit allgemeiner Beratung und höhere Ebene Erklärungen genauso gut wie glücklich sein.

Danke,

Oliver

War es hilfreich?

Lösung

Der traditionelle Ansatz besagt, dass Ihr Client-Code einen Wrapper verwenden sollten, die für die Instanziierung des COM-Objekt zuständig ist. Dieser Wrapper kann dann leicht verspottet werden.

Da Sie direkt Teile des Codes Instanziieren die COM-Objekte haben, tut dies nicht wirklich fit. Wenn Sie diesen Code ändern können, könnten Sie die Fabrik Muster verwenden: sie verwenden, um die Fabrik, um das COM-Objekt zu erstellen. Sie können die Fabrik verspotten alternative Objekte zurückzukehren.

Ob das Objekt über einen Wrapper oder über die ursprüngliche COM-Schnittstelle zugegriffen wird, sind Sie überlassen. Wenn Sie die COM-Schnittstelle zu verspotten wählen, denken Sie daran, Instrument IUnknown :: Query-Interface in Ihrem Mock, so dass Sie wissen, dass Sie alle Schnittstellen verspottet haben, vor allem, wenn das Objekt dann an einen anderen COM-Objekt übergeben wird.

Alternativ besuchen Sie die CoTreateAsClass Methode. Ich habe es nie benutzt, aber es könnte das tun, was Sie brauchen.

Andere Tipps

Es kommt auf ‚für die Testbarkeit der Gestaltung‘. Idealerweise sollten Sie nicht diese COM-Objekte direkt instanziiert, sondern sie durch eine Schicht von Dereferenzierung zugreifen sollten, die durch ein Mock-Objekt ersetzt werden kann.

Nun COM selbst macht einen Dereferenzierungsebene bieten und man konnte ein Mock-Objekt zur Verfügung stellen, die einen Ersatz für die reale Verfügung gestellt, aber ich vermute, es wäre ein Schmerz zu schaffen, und ich zweifle, ob Sie viel Hilfe von ein bekäme bestehende Mockframework.

würde ich eine dünne Wrapper-Klasse um das Dritte COM-Objekt schreiben, die die Fähigkeit, ein Mock-Objekt zu laden hat, anstatt das tatsächliche COM-Objekt in der Einheit Testsituation. Ich mache das normalerweise durch einen zweiten Konstruktor aufweist, die ich vorbei in den mock-Objekt aufrufen. Der normale Konstruktor hätte nur das COM-Objekt als normal geladen.

Wikipedia-Artikel hat eine gute Einführung in das Thema Wikipedia artible

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