2015-03-17 9 views
5

Ich habe ein Kochbuch mit einer Bibliothek, z. library.rb. Es enthält eine CONSTANT:Chefspec lädt Bibliotheken wiederholt und gibt die Warnung "bereits initialisiert konstant CONSTANT"

CONSTANT = 'constant' 

Wenn ich Unit-Tests für dieses Kochbuch zu schreiben, es gibt mir immer die Warnung:

(Some prefix...)warning: already initialized constant CONSTANT 
(Some prefix...)warning: previous definition of CONSTANT was here 

Die Warnungen kommen immer wieder, so oft wie die Anzahl der Beispiele (Testfälle) minus eins. Ich denke, weil chefspec die Bibliotheken für jedes Beispiel einmal lädt. Könnte mir jemand sagen, wie man die Bibliotheken nur einmal lädt oder wie man die Warnmeldung deaktiviert?

+0

'CONSTANT' ist eine Konstante, es ist keine Variable. – sawa

Antwort

6

Kurzfristige, ändern Sie es zu:

CONSTANT ||= 'constant' 

Langfristig ist es besser, ein let() zu verwenden, oder die Konstante aus dem Testfall zu bewegen, oder jede andere Art und Weise die Konstante zu ersetzen, zu wählen, oder um sicherzustellen, dass der Testcode die Bibliothek einmal nicht oft lädt.

Bearbeiten - Guter Punkt von @sawa in den Kommentaren: Wenn Ihre Konstante nil oder false ist, dann wird der ||= Ansatz nicht die Warnungen stoppen, so dass Sie eine bessere Lösung wie wollen:

CONSTANT = 'constant' unless defined? CONSTANT 
+1

Dies funktioniert in diesem speziellen Fall, wird jedoch abgebrochen, wenn der Wert "nil" oder "false" ist. Es ist besser, 'Defined?' Oder seine Kins zu verwenden. – sawa