2015-11-24 7 views
1

У меня есть постоянный в моем драгоценном камне, который будет извлекать данные из приложения-потребителя при запуске сервера. Но когда я выполняю тестовые примеры, как я могу пропустить это вызов константы, чтобы он не выдавал никаких ошибок.Как выполнить rspec, когда глобальная константа вызывает ошибку?

#file in my gem 
class FallbackConfig 
    DATA = YAML.load(File.open(File.join('config','fallback_data','data.yml')))  
end 

При запуске приложения с драгоценным камнем Нет проблем. Но когда я выполняю тестовые примеры, в то же время он ищет это значение и выдает следующую ошибку.

Praveen-Mac-mini:global-nav-gem brilliomac$ rspec spec 
Coverage report generated for RSpec to /Users/brilliomac/Desktop/global-nav-gem/coverage. 22/88 LOC (25.0%) covered. 
/Users/brilliomac/Desktop/global-nav-gem/lib/global_nav_gem/configuration_file.rb:2:in `initialize': No such file or directory @ rb_sysopen - config/fallback_data/global_nav_data.yml (Errno::ENOENT) 

ответ

0

вы можете попробовать это в тесте:

it 'my test' do 
    some_hash = {} 
    stub_const(FallbackConfig::DATA, some_hash) 
    expect(FallbackConfig::DATA).to eq some_hash 
end 

Вы можете узнать больше на гася константами с RSpec here

+0

Stubbing подойдет, когда тестовый случай выполнит и выбросит ошибку. Но для меня он выполняет вышеуказанный класс перед выполнением любого тестового файла и не выдает файл ошибки. – Praveenkumar

0

коммутатором константы к методу класса, который memoizes данные:

class FallbackConfig 
    def self.data 
    @data ||= YAML.load(...) 
    end 
end 

Затем измените пользователей константы, чтобы вызвать класс мето d вместо этого. Данные будут загружены - только один раз - если он используется, но не загружен, если он не используется.

0

Требование к файлу немедленно вызовет разбор файла YAML, убрав возможность уточнить класс или переопределить константу или что-то еще. Единственное решение, которое я вижу в этой ситуации (но мне это не нравится), - это временное переопределение метода YAML.load перед загрузкой файла и его последующим восстановлением.

Но, конечно, использование метода класса вместо константы, как предлагает @ wayne-conrad, было бы намного проще.

 Смежные вопросы

  • Нет связанных вопросов^_^