2016-07-29 13 views
1

Ich habe ein Modell, dessen Verhalten sich basierend auf einer Konfigurationsdatei leicht ändern sollte. Die Konfigurationsdatei wird theoretisch für jede Installation der App für meine Kunden geändert. Wie kann ich diese Änderungen testen?Wie kann ich verschiedene App-Konfigurationen in Rails testen?

Zum Beispiel ...

# in app/models/person.rb 

before_save automatically_make_person_contributer if Rails.configuration.x.people['are_contributers_by_default'] 



# in test/models/person_test.rb 

test "auto-assigns role if it should" do 
    # this next line doesn't actually work when the Person#before_save runs... 
    Rails.configuration.x.people['are_contributers_by_default'] = true 
end 

test "won't auto assign a role if it shouldn't" do 
    # this next line doesn't actually work when the Person#before_save runs... 
    Rails.configuration.x.people['are_contributers_by_default'] = false 
end 

Es macht keinen Sinn für diese, auf die in der Datenbank gespeichert werden, da sie eine Zeitkonfigurationen sind, aber ich brauche, um meine app stellen Sie sicher, unter den ganzen verhält mögliche Konfigurationen in allen Umgebungen.

Antwort

1

Sieht aus wie die Art, dies zu tun, ist die Person Klasse neu schreiben, so dass automatically_make_person_contributer tatsächlich die Auswertung von Rails.configuration.x.people['are_contributers_by_default'] durchführt. Das macht meine Tests glücklich und technisch nicht die Art und Weise ändern, die App funktioniert:

# in app/models/person.rb 

before_save :automatically_make_person_contributer 

private 
    def automatically_make_person_contributer 
    if Rails.configuration.x.people['are_contributers_by_default'] 
     # do the actual work here 
    end 
    end 

Dies bedeutet jedoch, dass ein Wert, der die gleiche für die Lebensdauer des App-Prozesses bleiben wird wird jedes Mal überprüft werden Eine Person wird erstellt, anstatt nur einmal bei der Erstellung der Person Klasse überprüft.

In meinem speziellen Fall ist dieser Kompromiss in Ordnung, aber andere wollen vielleicht die tatsächliche Antwort auf meine Frage.