Im Moment mache ich etwas ähnliches wie dies zu Integrationstest eine Bibliothek, die mit unseren API-Controllern kommuniziert, und so weit so gut, aber ich habe in einen Haken geraten. In all unseren anderen Integrationstests führen wir den Test innerhalb einer MSDTC-Transaktion auf Isolationsstufe ReadCommitted aus, so dass jeder seine eigene kleine private Sitzung mit den Datenbanken usw. erhält, und am Ende jedes Tests werden die Transaktionen zurückgesetzt. ..Aber das funktioniert nicht für diese Tests, da die Transaktionen per-Thread sind und alle HttpClient / HttpServer-Methoden asynchron sind, also die Arbeit in einem anderen Thread als dem Haupt-Thread erledigt wird Dieser Test hat keine Ambient-Transaktion zum Abonnieren, und geht direkt mit und verpflichtet sich.
Ich habe ein paar Posts darüber gefunden, wie man ein TransactionScope in einem Thread öffnet und dann eine abhängige Transaktion erstellt, die über eine Closure an eine neue Aufgabe übergeben wird, aber ich habe keine Ahnung, wie man das auf einen HttpClient anwendet mit einem In-Memory-HttpServer verbunden. Ich verdächtige Ich denke nur nicht richtig darüber nach, aber das ist alles, was ich weiter machen muss.
Was macht Sinn / Arbeit / etc? Ich habe die volle Kontrolle über die Erstellung des HttpServers und des HttpClients, der sich damit verbinden wird, aber ich weiß nicht, was ich damit anfangen soll.
UPDATE:
Es wurden einige Fortschritte erzielt: Ich habe einen Message-Handler geschrieben, der eine abhängige Transaktion im Worker-Thread erstellen kann , wenn Transaction.Current dort eingetragen ist und für einige meiner Aufrufe , aber für andere ist es nicht, und ich frage mich, ob ich Schatten jagen könnte - wie, es gibt eine Menge ContinueWith herum, und ich denke, dass es auf dem aufrufenden Thread ausgeführt wird (was natürlich eine Transaktion hätte), wenn der Antecedent Aufgabe ist bereits abgeschlossen.
Wäre es möglich, das ganze Ding synchron laufen zu lassen und den Testfaden durchzuziehen? Ich habe einige mit ContinueWith'ing synchron ohne viel Erfolg experimentiert.
Es stellte sich heraus, dass der HttpClient und der HttpServer nicht Hintergrund-Threads durchdrehten - vielmehr hatte ich einige fehlerhafte Task.StartNews in meinem Code, die das Problem verursachten. Das Entfernen brachte mich dazu, zu gehen.
Wenn Sie keine echte HTTP-Verbindung verwenden, können Sie die Schnittstellen direkt über einen Code (mithilfe einer Assembly-Referenz) von einem Testframework aus aufrufen, mit dem Sie pro Sitzung oder pro Test starten können -up- und Shut-down-Arbeit (wie MSTests Klassen- und Testinitialisierungsfunktionen). In diesem Fall würden Sie ein TransactionScope öffnen, das für die Klasse in einer Membervariablen freigegeben ist, und es in der Klasse oder Test-Shutdown-Funktion ablegen. Da Sie .Commit () nicht aufgerufen haben, werden die während der Transaktion aufgetretenen Vorgänge zurückgesetzt.
Tags und Links asp.net-web-api c# task-parallel-library integration-testing transactionscope