2016-07-29 21 views
0

Ich schreibe einen Test in RSPEC, um sicherzustellen, dass eine Funktion eine korrekt sortierte Ergebnismenge zurückgibt. Der Test sieht folgendermaßen aus:Vergleichen von ActiveRecord-Ergebnissen mit sortierten Ergebnissen

Die Ergebnissätze scheinen äquivalent zu sein, der Test schlägt jedoch fehl. Der folgende Test nicht bestanden:

it 'returns matching accounts' do 
    results = Account.search(<search conditions>) 
    expect(results.map &:id).to eq results.order(<order clause>).map &:id 
end 

Ich bin davon überzeugt, dass dieser Test das tut, was ich brauche, aber gibt es eine bessere Art und Weise zwei Active Beziehungen zu vergleichen?

+0

Was ist die Fehlermeldung für den ersten Fehler? –

Antwort

2

Account.search gibt wahrscheinlich kein Array von Konten zurück, sondern eine ActiveRecord::Relation. Wenn Sie order für eine Relation aufrufen, gibt es ein anderes Beziehungsobjekt zurück und stimmt daher nicht überein.

Auf der anderen Seite, wenn Sie eine Methode für diese Beziehung aufrufen, die die Beziehung zwingt, die Abfrage tatsächlich für die Datenbank auszuführen, wird ein Array zurückgegeben. map ist ein solches Verfahren, andere sein könnte each, first, any?, load usw.

load scheint eine gute Wahl zu sein, zu verwenden, tatsächlich zu zwingen, die Datensätze aus der Datenbank geladen:

it 'returns matching accounts' do 
    results = Account.search(<search conditions>) 
    expect(results.load).to eq results.order(<order clause>).load 
end 

Eine andere Möglichkeit wäre, das Ergebnis mit einem Array zu vergleichen, das in Ruby statt in der Datenbank sortiert wurde. Es hängt davon ab, was Sie wirklich testen möchten, wenn dies eine bessere Option ist:

+0

'Last' arbeitete auf mysteriöse Weise mit einem Test, aber nicht mit einem anderen. Am Ende habe ich 'to_a' in den ActiveRecord-Beziehungen verwendet, um sie zu vergleichen. Ich hatte auch ein Array versucht, das in Ruby sortiert war, aber das gab mir eine andere Reihenfolge mit "äquivalenten" Zeilen - nicht falsch, aber nicht nützlich für den Vergleich mit dem Ergebnis aus der Datenbank. –