2016-04-20 17 views
0

Ich habe Probleme mit dem Zugriff auf die global verfügbare @db Variable innerhalb meiner RSPC-Tests. Die Variable @db wird in der App festgelegt, die über den spec_helper enthalten ist.RSpec Variables Scoping

-Code unten:

require File.expand_path '../../spec_helper.rb', __FILE__ 


p @db 
describe MyModel do 
    before do 
    p @db 
    end 
    context 'constraints' do 
    it 'is expected to do something' do 
     p @db 
    end 
    end 
end 

Als ich das laufen lasse, erhalte ich die Ausgabe:

#<Sequel::Mysql2::Database: "mysql2://root:@localhost/my_project"> 
nil 
nil 

darauf hinweist, dass die @db Variable richtig von außerhalb des rspec Test festgelegt ist, aber einmal nicht zugänglich Der Test läuft. Wie kann ich innerhalb meines Tests auf @db zugreifen?

Antwort

0

Ich bin mir nicht sicher, was Sie in Ihren spec_helper.rb haben, aber Sie sollten diese beinhalten:

RSpec.configure do |config| 
    config.before(:each) do 
    @db = 'your db object' 
    end 
end 

Dies ist das gleiche wie zuvor Haken direkt über das Testbeispiel definiert, außer es vor jedem global laufen Prüfung.

+0

Sie können auch Filter angeben, wenn Sie globale Regeln festlegen, finden Sie in diesem Thema für weitere Informationen: http://StackOverflow.com/Questions/29094646/Rspec-beforeeach-Hook-Conditional-apply –

+0

Ich versuchte das mit keinem Erfolg. Ich bekomme immer noch ein '' 'nil''' für' '@ db'''. Ich habe @ db = Datenbank ohne Erfolg. – PressingOnAlways

1

Variablen, die mit einem @ Sigil beginnen, sind Instanzvariablen. Sie gehören zu einem bestimmten Objekt (d. H. Beispiel), und von diesem Objekt aus kann auf nur zugegriffen werden. Sie werden immer relativ zu self nachgeschlagen.

In Ihrem Fall haben Sie zwei verschiedene Instanzvariablen von zwei verschiedenen Objekte.

In Zeile 4 ist self das so genannte main Top-Level-Objekt. In den Zeilen 7 und 11 ist self eine Instanz der Klasse RSpec::ExampleGroups::MyModel::Constraints, ein völlig anderes Objekt einer völlig anderen Klasse mit einem völlig anderen Satz von Instanzvariablen.

Wenn Sie wirklich Notwendigkeit Zugriff dass bestimmte Instanz Variable, können Sie so etwas tun könnte:

$main = self 

require File.expand_path '../../spec_helper.rb', __FILE__ 


p @db 
describe MyModel do 
    before do 
    p $main.instance_variable_get(:@db) 
    end 
    context 'constraints' do 
    it 'is expected to do something' do 
     p $main.instance_variable_get(:@db) 
    end 
    end 
end 

Aber die einfachste Lösung wäre, nur die Instanz-Variable auf die richtige Objekt im before Haken.

+0

Das Datenbankobjekt wird über sinatra-sequel gesetzt (https://github.com/rtomayko/sinatra- sequel/blob/master/lib/sinatra/sequel.rb). Irgendeine Idee, wie man auf das '' 'Datenbank''' Objekt zugreift? – PressingOnAlways