Mocking eine Linq2Sql DataContext
Ich habe eine Lin2Sql DataContext, die ich benutze, um alle meine Daten aus einer sql-Datenbank, jedoch bin ich kämpfen, um einen Weg zu finden, um erfolgreich zu Verspotten, damit kann ich erstellen, die entsprechenden Unit-Tests.
In meinem data-access-Objekte, die ich will, um zu testen, ich frische den Rahmen jedes mal und ich finde es schwer zu finden, eine einfache geeignete Weise zu verspotten dies.
Hilfe mit dieser Angelegenheit wird sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spott der linq-to-sql-Kontext ist in der Tat eine riesige Aufgabe. Ich in der Regel umgehen, indem ich meine unit-tests laufen gegen eine separate Kopie der Datenbank, die mit Daten speziell gestaltete zu passen, die unit-tests. (Ich weiß, es kann argumentiert werden, dass es nicht mehr unit-tests, sondern Integrationstests, aber das ist mir egal, solange ich den code getestet).
Halten Sie die Datenbank in einen bekannten Zustand, den ich wickeln Sie jeden test in einem
TransactionScope
dem Rollback am Ende der Prüfung. So ist der Status der Datenbank wird nie geändert.Einen Probe-test-Methode sieht wie folgt aus:
Den code aus einem blog post über die Methode, die ich schrieb vor einiger Zeit: http://coding.abel.nu/2011/12/using-transactions-for-unit-tests/
Da Sie eine Art und Weise zu verspotten, ein
DataContext
ich davon ausgehen, dass Sie wirklich wollen, zu tun, einige unit-tests und nicht-integration-tests.Gut, ich werde Ihnen sagen, wie dies zu erreichen, aber zuerst möchte ich Sie ermutigen, Lesen Sie die folgenden links, Sie sind alle über sauber schreiben von testbarem code.
http://misko.hevery.com/code-reviewers-guide/
http://misko.hevery.com/attachments/Guide-Writing%20Testable%20Code.pdf
Und überprüfen Sie die links, die von dieser Reaktion:
Watch the clean code talks von Misko Hevery (gegeben auf der Google-Leute)
http://www.youtube.com/watch?v=wEhu57pih5w&feature=player_embedded
http://www.youtube.com/watch?v=RlfLCWKxHJ0&feature=player_embedded
http://www.youtube.com/watch?v=-FRm3VPhseI&feature=player_embedded
http://www.youtube.com/watch?v=4F72VULWFvc&feature=player_embedded
Eine Sache, die ich wiederholt zu mir selbst und zu meinen Mitmenschen bei der Arbeit, ist, dass jeder kann schreiben unit Tests, denn Sie sind dumm, einfach zu schreiben. So ein einfacher test ist, im wesentlichen alle über einige Vergleiche und Ausnahmen werfen, wenn das Ergebnis ausfällt, das kann jeder. Natürlich, es gibt Hunderte von frameworks, die uns helfen, schreiben Sie diese tests in einer elegante Weise. Aber das wirkliche Angebot und die wirkliche Anstrengung Leichentuch auf erfahren Sie, wie rein zu schreiben von testbarem code
Selbst wenn Sie mieten Misko Hevery, um Ihnen helfen, einen Test schreiben, hat er eine echt harte Zeit, Sie zu schreiben, wenn Ihr code ist nicht getestet-freundlich.
Nun den Weg zu mock ein
DataContext
Objekte ist: tun Sie es nichtStattdessen wickeln Sie die Anrufe über eine benutzerdefinierte Schnittstelle statt:
Hinweise:
Wenn Sie erklären Ihre
IMyDataContextCalls
Schnittstelle, die Sie tatsächlich die Abstraktion der Verwendung einerDataContext
daher diese Schnittstelle sollte nur POCO-Objekte (die meiste Zeit), wenn Sie diesem Ansatz Folgen Ihrer Schnittstellen wird entkoppelt von ungewünschten Abhängigkeiten.In der spezifischen
MyDataContextCalls
Umsetzung, Sie sind ausdrücklich mit einDataClasses1DataContext
Zusammenhang, aber Sie sind frei, zu ändern, die Durchführung zu jeder Zeit, und dass keinen Einfluss auf Ihre externen code, und das ist, weil Sie arbeiten immer mit derIMyDataContextCalls
- Schnittstelle statt. So hat man jederzeit ändern könnte dies beispielsweise für die Umsetzung einer anderen mit der wunderbaren NHibernate =) oder die Armen ef oder ein mock einerEndlich, aber nicht zuletzt. überprüfen Sie bitte mein code, und Sie werden feststellen, dass es gibt keine
new
Betreiber in die domain-Objekte. Dies ist in der Regel zu dumm beim schreiben von test-freundlichen code: entkoppeln die Verantwortung für die Erstellung von Objekten außerhalb Ihrer domain ObjekteIch persönlich benutze drei frameworks, die auf jedes Projekt und auf jeden test, den ich Schreibe, werde ich wirklich empfehlen:
AutoFixture
Moq
FluentAssertions
Zum Beispiel, im code oben, ich habe Ihnen gezeigt, wie Sie schreiben, ein Handbuch fake für Ihr repository, aber das ist offenbar etwas, was wir nicht tun wollen in einem realen Projekt, vorstellen, die Zahl der Objekte, die Sie haben würde, um code, um zu schreiben Ihre tests.
Stattdessen nutzen Sie die Kraft von AutoFixture kombiniert mit Moq:
Diese Zeile:
var m = new MyCommand(new MyFakeDataContextFake());
Werden:
... Und das ist es, wird dieser code automatisch erstellen von mocks für alle Objekte benötigt, die im Konstruktor der
MyCommand
.Kurz gesagt, Sie don ' T mock DataContext. Sie extrahieren Schnittstelle von it und mock, die Schnittstelle mit einigen Kollektionen für entity-sets, und überprüfen Sie dann den Inhalt dieser Sammlungen.