der Präambel: ich eine stark angeschlossen und voll Schichtklasse mockable Daten ausgelegt sind, dass die Business-Schicht sollte in einer einzigen Transaktion einbezogen werden ein TransactionScope
, wenn mehrere Anrufe erstellen erwartet.Einheit Testen der Verwendung von Transaction
Das Problem: Ich möchte Einheit testen, dass meine Business-Schicht ein TransactionScope
Objekt verwendet, wenn ich es erwarte.
Leider ist das Standardmuster TransactionScope
für die Verwendung ist wie folgt:
using(var scope = new TransactionScope())
{
// transactional methods
datalayer.InsertFoo();
datalayer.InsertBar();
scope.Complete();
}
Zwar ist dies eine wirklich große Muster in Bezug auf Benutzerfreundlichkeit für den Programmierer ist, die Prüfung, dass es fertig ist scheint ... unpossible mir. Ich kann nicht feststellen, dass ein transientes Objekt instanziiert wurde, geschweige denn es verspotten, um festzustellen, dass eine Methode dafür aufgerufen wurde. Doch mein Ziel für die Berichterstattung bedeutet, dass ich muss.
Die Frage: Wie kann ich über das Erstellen von Unit-Tests gehen, die sicherstellen, TransactionScope
wird entsprechend entsprechend dem Standardmuster verwendet?
Final Thoughts: Ich habe eine Lösung in Betracht gezogen, die sicherlich die Abdeckung bieten würde ich brauche, aber haben es als zu komplex abgelehnt und nicht dem Standard TransactionScope
Muster entspricht. Es beinhaltet eine CreateTransactionScope
Methode für mein Datenschichtobjekt, die eine Instanz von TransactionScope
zurückgibt. Aber da TransactionScope Konstruktorlogik und nicht-virtuelle Methoden enthält und daher schwierig, wenn nicht unmöglich zu mocksen ist, würde CreateTransactionScope
eine Instanz DataLayerTransactionScope
zurückgeben, die eine anschauliche Fassade in TransactionScope
wäre.
Während dies den Job erledigen könnte, ist es komplex und ich würde lieber das Standardmuster verwenden. Gibt es einen besseren Weg?
Vielen Dank für diese wertvolle Antwort! ich habe eine que. Kann ich das mit ES DB (NoSQL) verwenden? –