2016-06-29 18 views
1

Ich habe eine ActiveRecord-Klasse, die Bereiche dynamisch hinzugefügt hat basierend auf Inhalt einer anderen Tabelle.Rails Tests, Fixtures & Class loading order

(vereinfachte Codebeispiel)

class Thing < ActiveRecord::Base 

    Feature.all.each do |feature| 
    scope feature.name, ->{joins(:feature).where("feature.name = #{feature.name})} 
    end 
end 

Ein weiterer Teil der Benutzeroberfläche der App ist ein „Ding-Anzeige“, die Sie suchen und wenden diese Feature-Bereiche als Teil der Suche können.

Das alles funktioniert gut in der laufenden App.

In Tests jedoch scheint Erfolg hängt davon ab, in welcher Reihenfolge Dinge geladen werden. Manchmal Thing hat die erwarteten Bereiche, andere Male nicht. Ich dachte, ich könnte die Feature Klasse und Vorrichtungen zuerst laden, indem Sie Feature.count aufrufen, bevor irgendwelche Tests laufen, aber das funktioniert nicht.

Gibt es eine Möglichkeit, das Laden von Klassen/Fixtures zu erzwingen, um dies zu beheben?

+0

Sind Sie sicher, dass dies nicht mit [this] (http://stackoverflow.com/a/28515064/2116518) oder [this] verbunden ist (https://sanjusoftware.wordpress.com/2010/12/17/ Schienen-Fixtures-Load-Order /)? –

+0

@NicNilov Ich verwende Postgres nicht, ich habe keine Fremdschlüsseleinschränkungen in meiner Datenbank, und die Tests bestehen/scheitern je nach der Reihenfolge der Ausführung der Tests. Diese verknüpften Probleme treffen also nicht zu. – z5h

Antwort

0

Mit dem Ziel sicherzustellen, dass Fixtures vor dem Unterricht geladen werden, gibt es ein paar Richtungen zu erkunden.

Eine ist zu erkennen, wenn Fixtures das Laden beenden, und erzwingt das erneute Laden der Klasse Thing, um korrekte Bereiche zu generieren. Das Problem dabei ist, dass ich keine Möglichkeit gefunden habe, das geladene Event zu finden. Ein tangentielles Problem ist, dass ein einzelnes Klassen-Reload in Anwesenheit von config.cache_classes = true ziemlich hacky wäre.

Ein anderer, viel versprechenderer Ansatz wird in this answer beschrieben und besteht darin, die Testlaufaufgabe in einen Wrapper zu stellen, der sicherstellt, dass die Vorrichtungen zuerst geladen werden.