Rspec: So testen Sie ActiveRecord :: Base.connection.execute

8

Ich verwende rohe / bare-metal-sql-Einfügungen, um die Schreibleistung in meinem Service zu erhöhen. Ich habe so etwas in meinem Modul -

%Vor%

Wenn ich eine rspec wie unten schreibe, testet sie alles, außer ob die Einfügung durchgeführt wurde oder nicht. Daher werden meine Erwartungen nie funktionieren, da rspec, database_cleaner usw. Rollbacks und Transaktionen ausführen. Ich habe versucht,

zu verwenden %Vor%

und

%Vor%

aber die Inserts gehen immer noch nicht in meine Testdatenbank

%Vor%

Wie würde ich das testen? Was ist eine gute Strategie, rohe SQL-Inserts wie diese zu testen?

    
khal 05.02.2015, 00:48
quelle

1 Antwort

2

Es gibt zwei Denkrichtungen, wie man Code richtig testen kann: Die Perspektive "Methoden" bedeutet, dass man sein eigenes korrektes Verhalten sicherstellt, und die Perspektive "Ergebnisse" favorisiert die Überprüfung der Ergebnisse. Ich werde beide Perspektiven bieten.

Methoden:

Sie haben ActiveRecord::Base.connection.execute nicht geschrieben und sind nicht dafür verantwortlich, dass es korrekt funktioniert. Ihr Test kann sich dann auf das konzentrieren, was Sie an die execute-Methode übergeben haben. Eine übereinstimmende Spezifikation könnte dann in etwa so aussehen.

%Vor%

wo ... ist die SQL, die Sie generieren möchten. Die Überprüfung der SQL-Funktionen kann je nach Geschmack anderswo oder gar nicht erfolgen. Dies garantiert Ihnen (und zukünftigen Entwicklern), dass die richtige Anweisung an Ihre Datenbank übermittelt wurde.

Ergebnisse:

Dieser Ansatz findet keine Bestätigung in welchem ​​Ansatz, er findet Beruhigung in den Ergebnissen. Es ist der Ansatz, den Sie in den obigen Beispielen nehmen.

Sie zeigen uns nicht, wie die perform -Methode oben aussieht. Daher sind wir uns nicht sicher, ob möglicherweise ein Problem mit Ihrem Implementierungscode vorliegt, im Gegensatz zu dem von Ihnen verwendeten reload -Mechanismus um ActiveRecord aufzufordern, Ihre Änderungen zu bemerken. ActiveRecord verfügt über eine Reihe von Leistungsverbesserungen, die dazu dienen, die direkte Bindung zwischen den Datenbankinhalten und dem, auf das Sie in der Objektgrafik Ihrer Ruby-VM zugreifen können, in die Cloud zu übertragen. Sie können Schwierigkeiten damit haben, dieses Verhalten zu überschreiben, wenn Sie möchten, aber wenn Sie zufrieden sind, ActiveRecord direkt in Ihrer Implementierung zu verwenden, sind Sie vielleicht auch damit zufrieden, dies in Ihren Tests zu tun?

%Vor%

Ich bemerke jedoch einige beunruhigende Schlussfolgerungen hier. Sie bearbeiten die Tabelle " history ", erwarten jedoch Ergebnisse von einem vermutlich Device -Modell. Die Implementierung der Methode status ist dann auch für Ihr Problem relevant. Möglicherweise möchten Sie zusätzliche Tests für die Methode Device#status schreiben, wenn Sie diesen Ansatz wählen.

    
Jim Van Fleet 23.10.2015 18:42
quelle