rails rspec - Wie man nach einer Modellkonstante sucht?

7

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.

    
Michael Durrant 05.07.2012, 03:52
quelle

7 Antworten

10

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"

    
dutchstrider 17.12.2012, 15:22
quelle
8

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.

    
RyanScottLewis 16.04.2013 23:41
quelle
6

Wenn Sie have_constant sagen möchten, können Sie einen benutzerdefinierten Matcher dafür definieren:

%Vor%

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

    
David Chelimsky 05.07.2012 04:35
quelle
2

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.

    
Avram 04.04.2014 13:41
quelle
0

Sie könnten

verwenden %Vor%     
xdazz 05.07.2012 03:57
quelle
0

In RSpec 2 konnte ich dies in einer Zeile wie folgt ausführen:

it { subject.class.should be_const_defined(:MY_CONST) }

Das heißt, überprüfen Sie die Klasse anstelle der Instanz.

    
Todd 24.03.2016 21:37
quelle
0

In meinem Modell

%Vor%

In meiner rspec

%Vor%     
Juarez Lustosa 03.03.2017 17:10
quelle

Tags und Links