Wie kann ich etwas tun wie:
%Vor% In meinem Modell (aktiver Datensatz) habe ich FIXED_LIST = 'A String'
Es ist kein db-Attribut oder eine Methode und ich konnte responds_to
oder has_attribute
nicht dafür verwenden (sie scheitern). Was kann ich verwenden, um danach zu suchen? - Ich habe die shofa-matchers installiert.
Basierend auf der Antwort von David Chelimsky, habe ich das geschafft, indem ich seinen Code leicht modifiziere.
In einer Datei spec / support / utilities.rb (oder einer anderen in spec / support) können Sie:
setzen %Vor%Beachten Sie die Verwendung von "RSpec :: Matchers.define" statt "Matcher"
Dies ermöglicht es, auf Konstanten in Ihren Spezifikationen zu prüfen, wie:
%Vor%Beachten Sie die Verwendung von "have_constant" anstelle von "have_const"
Es liest sich ein wenig albern, aber:
%Vor% Der Grund ist, dass Rspec "magische" Matcher für Methoden hat, die mit be_
und have_
beginnen. Zum Beispiel würde it { should have_green_pants }
bestätigen, dass die Methode has_green_pants?
für subject
true
zurückgibt.
Auf die gleiche Weise würde ein Beispiel wie it { should be_happy }
bestätigen, dass die Methode happy?
für subject
true
zurückgibt.
Also behauptet das Beispiel it { should be_const_defined(:VERSION) }
, dass const_defined?(:VERSION)
true
zurückgibt.
Wenn Sie have_constant
sagen möchten, können Sie einen benutzerdefinierten Matcher dafür definieren:
Wenn Sie versuchen, die Einzeilersyntax zu verwenden, müssen Sie sicherstellen, dass es sich bei dem Betreff um eine Klasse (keine Instanz) handelt, oder suchen Sie im Matcher danach:
%Vor%Siehe Ссылка für weitere Informationen zu benutzerdefinierten Matching-Tools.
HTH, David
Eine Warnung an alle, die versuchen zu testen, dass Konstanten definiert sind: Wenn Ihr Code bei der Definition einer Klasse eine undefinierte Konstante referenziert, stürzen Ihre Spezifikationen ab, bevor sie zu Ihrem Test kommen.
Dies kann dazu führen, dass Sie das glauben
%Vor%kann den NameError nicht abfangen, weil Sie einen großen Stack-Trace anstelle eines netten "erwarteten Fehlers, der ausgelöst wird, aber ausgelöst wird, NameError" erhalten.
Inmitten des riesigen Stack-Trace kann es schwierig sein, zu bemerken, dass Ihr Test tatsächlich in Zeile 1 abstürzt: "spec / spec_helper" ist erforderlich, weil Ihre gesamte Anwendung nicht geladen werden kann, bevor sie zu Ihrem eigentlichen Test kommt.
>Dies kann passieren, wenn Sie dynamisch definierte Konstanten haben, wie es zB von ActiveHash :: Enum gemacht wird, und Sie dann bei der Definition einer anderen Konstante verwenden. Versuchen Sie nicht zu testen, ob sie existieren, jede Spezifikation in Ihrer App stürzt ab, wenn eine davon nicht definiert wird.