2016-04-20 3 views
0

У меня возникли трудности с доступом к глобально доступной переменной @db в моих тестах rspec. Переменная @db устанавливается в приложении, которое включено через spec_helper.RSpec Variable Scoping

код ниже:

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 

Когда я запускаю это, я получаю выход:

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

, указывающий, что переменная @db правильно установлена ​​снаружи RSpec тест, но не доступен один раз тест проходит. Как я могу получить доступ к @db из моего теста?

ответ

0

Я не уверен, что у вас есть в вашем spec_helper.rb, но вы должны включать в себя следующее:

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

Это то же самое, как определение, прежде чем крючок прямо над тестовым примером, за исключением того, что будет работать по всему миру перед каждым контрольная работа.

+0

Вы также можете указать фильтры при настройке глобальных правил, см. Эту тему для получения дополнительной информации: http://stackoverflow.com/questions/29094646/rspec-beforeeach-hook-conditional-apply –

+0

Я пробовал это без успеха. Я все еще получаю '' '' nil''' за '' '@ db'''. Я сделал @db = базу данных без успеха. – PressingOnAlways

1

Переменные, начинающиеся с @ sigil: переменные экземпляра. Они относятся к определенному объекту (то есть к экземпляру), и к нему можно получить доступ только только от от этого объекта. Они всегда смотрят вверх относительно self.

В вашем случае у вас есть две разные переменные экземпляра два разных объекта.

В строке 4, self находится так называемый main объект верхнего уровня. В строках 7 и 11 self является экземпляром класса RSpec::ExampleGroups::MyModel::Constraints, совершенно другого объекта совершенно другого класса с совершенно другим набором переменных экземпляра.

Если вы действительно необходимость доступа , что частности переменная экземпляра, вы могли бы сделать что-то вроде этого:

$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 

Но самым простым решением было бы просто установить переменную экземпляра на правильно объект в крюке before.

+0

Объект базы данных устанавливается через синатра-сиквел (https://github.com/rtomayko/sinatra-sequel/blob/master/lib/sinatra/sequel.rb). Любая идея, как получить доступ к объекту '' 'database'''? – PressingOnAlways