Wie richte ich C # Unit Tests für CRM 2011 Plugins korrekt ein?

8

Der Versuch, ein Plugin in CRM 2011 zu debuggen, kann extrem schwierig sein. Es gibt nicht nur Probleme, die .pdb-Dateien am richtigen Ort auf dem Server zu haben, sondern jedes Mal, wenn Sie eine Änderung an der Codierung vornehmen, müssen Sie sich die Mühe machen, das Plugin zu installieren und neu zu registrieren. Da der Auslöser in CRM selbst ist, ist es schwierig, einen Komponententest dafür zu erstellen.

Mein aktueller Prozess zum Schreiben eines Komponententests für ein brandneues Plugin ist eher langsam und fehlerbehaftet, geht aber in etwa so:

  1. Registrieren Sie das neue Plugin mit dem SDK-Plugin-Registrierungstool
  2. Hängen Sie einen Debugger an die w3wp.exe an, und setzen Sie einen Unterbrechungspunkt im Plugin-Code.
  3. Löse das Plugin durch jede Aktion aus, für die es ausgeführt wird.
  4. Wenn der Unterbrechungspunkt erreicht wird, serialisieren Sie die Premage-, Postimage- und Zielwerte der Pipeline in XML-Dateien. Dies wird dann die Eingabe für meinen Komponententest.
  5. Beenden Sie das Debuggen und erstellen Sie einen neuen Komponententest. Verwenden Sie RhinoMocks, um den PluginExecutionContext und den ServiceProvider nachzuahmen, indem Sie die serialisierten XML-Dateien als Stubs für die Eingabeparameter laden.
  6. Erstellen Sie Methoden, die am Anfang und am Ende jedes Komponententests ausgeführt werden, der Dummy-Daten für den zu testenden Komponententest zurücksetzt (zuerst versucht, sie zu löschen und dann hinzuzufügen) und anschließend die Dummy-Daten am Ende des Tests löscht / li>
  7. Bearbeiten Sie die serialisierten Dateien, um auf die Dummy-Daten zu verweisen, damit ich sicherstellen kann, dass das Plugin bei jeder Ausführung mit genau denselben Daten arbeitet.
  8. Deklariere und instanziiere das Plugin im Komponententest und übergebe die verspotteten Objekte
  9. Führe das Plugin aus, führe zusätzliche Abfragen aus, um sicherzustellen, dass das Plugin die Arbeit, die ich erwartet habe, ausgeführt hat, Bei einem Fehler bestätigen.

Dies ist ein Schmerz zu tun. Von der korrekten Darstellung der Bilder über das Erstellen der Dummy-Daten bis hin zum Zurücksetzen der Bilder bei jeder Testdurchführung scheint viel Raum für Verbesserungen zu geben.

Wie kann ich ein Plug-in testen, ohne es wirklich aus CRM auszulösen, oder zuerst alle Tests durchlaufen, um es in CRM zu debuggen, und einmalige Dummy-Daten für jeden Test erstellen? Wie kann ich mithilfe von Injection das Löschen, Erstellen, Testen, Überprüfen und Löschen von Daten in CRM für jeden Komponententest überflüssig machen?

Aktualisierung 2016

Diese Frage bekommt immer noch einige Treffer, also dachte ich, ich würde hinzufügen, was die beiden (die ich kenne) Open-Source-Projekte, die gefälschte CRM-Instanzen für Komponententests bereitstellen:

  • FakeXrmEasy - Erstellt von Jordi (siehe Antwort unten)
    • In erster Linie gefälschter CRM-Service
    • Unterstützung für das Plugin / Workflow-Fake
    • Abhängigkeit von FakeItEasy
    • Tolle Dokumentation
  • XrmUnitTest - Erstellt von mir
    • Gefälschter CRM-Service + mehr (Annahmen, Entity Builders usw.)
    • Fließende Unterstützung für das Plugin / Workflow-Fake
    • Keine Abhängigkeit von irgendwelchen spöttischen Rahmenbedingungen
    • Sucky Documentation (Ich arbeite daran)

Checkout dieses Video habe ich erstellt, um die Unterschiede zu vergleichen und zu vergleichen.

    
Daryl 26.07.2012, 18:08
quelle

3 Antworten

2
  

Wie kann ich ein Plug-in testen, ohne es wirklich aus CRM auszulösen, oder alle Debugging-Prozeduren in CRM durchlaufen und einzigartige Dummy-Daten für jeden Test erstellen?

Mit Spott. Siehe diesen Link für welche Klassen mit RhinoMocks zu verspotten. Klingt so, als ob du in dieser Hinsicht auf dem Weg bist.

  

Wie kann ich mithilfe von Injection für jeden Komponententest das Löschen, Erstellen, Testen, Verifizieren und Löschen von Daten in CRM überflüssig machen?

Das Eingeben von Werten für die Eingabeparameter kann durch Stubbing in einer handgesteuerten Instanz der Entität erfolgen, die Sie manipulieren möchten:

%Vor%

Ist das nicht einfacher, als die XML-Daten zu erfassen und die gesamte Eingabeparameter-Sammlung zu rehydratisieren?

BEARBEITEN: Für den Datenzugriff besteht die übliche Empfehlung darin, den Datenzugriff in Klassen zu integrieren. Das Repository-Muster ist beliebt, aber zu viel für das, was wir hier brauchen. Für Ihre Plugins-Ausführungsklassen "injizieren" Sie Ihre verspottete Klasse bei der Erstellung. Ein leerer Konstruktor, der das Standardrepository initialisiert, und ein zweiter Konstruktor, der ein IRepository übernimmt.

%Vor%

Abhängig von der Komplexität Ihrer Plugin-Schritte kann dies dazu führen, dass viele Repositories an jede Klasse übergeben werden, was zu einer Belastung führen könnte. Dies ist jedoch die Grundlage, der Sie bei Bedarf Komplexität hinzufügen können.

    
BenPatterson1 26.07.2012, 20:57
quelle
4

Ich serialisiere den Ausführungskontext des Plugins zur Verwendung mit Komponententests in eine Datei. Es gibt ein gutes Projekt auf Codeplex, das dies Ссылка

macht

Erleichtert das Debuggen und Komponententesten und Sie können reale Tests "aufzeichnen".

    
PompeyCoder 27.07.2012 07:33
quelle
2

Eine wirklich gute Option wäre es, eine spöttische Bibliothek zu benutzen, die sich mit Mocks und Fälschungen beschäftigt, weil ich meine eigenen erschaffen wollte und immer viel Zeit damit verschwendet habe, Fälschungen oder Mocks zu erzeugen, bis ich diese Bibliothek erschaffen habe für dich. Probieren Sie FakeXrmEasy

aus     
Jordi 21.01.2016 15:56
quelle