Ошибка "undefined method `[]'для nil:NilClass"при удаленном запуске теста Serverspec
У меня есть тест Serverspec с использованием inifile gem:
require 'spec_helper'
require 'inifile'
describe 'inifile test -' do
file = '/tmp/testfile1.ini'
file_ini = IniFile.load(file)
it 'testfile1.ini should contain expected values' do
expect(file_ini['section1']['variable1']).to eq('value1')
end
end
Тест проходит, если rake
выполняется локально на компьютере (либо на гостевой Ubuntu, либо на хосте OS X, где inifile
драгоценный камень установлен).
Тем не менее, когда я бегу rake
на Vagrant box (то есть на хосте, подключающемся с SSH к Ubuntu на Vagrant), происходит сбой с сообщением:
1) inifile test - testfile1.ini should contain expected values
On host `molecule-test'
Failure/Error: expect(file_ini['section1']['variable1']).to eq('value1')
NoMethodError:
undefined method `[]' for nil:NilClass
# ./spec/inifile_spec.rb:8:in `block (2 levels) in <top (required)>'
Я использую по умолчанию Rakefile
а также spec_helper.rb
,
/tmp/testfile1.ini
как показано ниже, хотя тест не проходит независимо от содержимого:
[section1]
variable1=value1
Мне кажется, это какая-то проблема с персонажами, которым не удалось избежать, но я не совсем уверен.
Что может быть не так?
2 ответа
Убедившись, что inifile
установлен на экземпляре Vagrant, довольно нелегкий способ сделать это примерно так:
describe 'inifile test -' do
file_ini = command("ruby -rinifile -e \"print IniFile.load('/tmp/testfile1.ini')['section1']['variable1']\"").stdout
it 'testfile1.ini should contain expected values' do
expect(file_ini).to eq('value1')
end
end
Я не знаю, если file
переменная область будет работать внутри этого command
метод, поэтому я проигнорировал.
Аскер techraf добавляет этот более чистый маршрут, учитывая хорошее знание inifile
API.
describe 'inifile test -' do
file_ini = IniFile.new(content: command("cat /tmp/testfile1.ini").stdout)
it 'testfile1.ini should contain expected values' do
expect(file_ini['section1']['variable1']).to eq('value1')
end
end
При некотором сотрудничестве мы приходим к этому, мы надеемся, оптимальному решению.
describe 'inifile test -' do
file_ini = IniFile.new(content: file('/tmp/testfile1.ini').content)
it 'testfile1.ini should contain expected values' do
expect(file_ini['section1']['variable1']).to eq('value1')
end
end
NoMethodError:
undefined method `[]' for nil:NilClass
Вышеуказанная ошибка может указывать на то, что :ssh
бэкэнд не был настроен правильно, с необходимыми свойствами (возможно, отсутствует целевой хост)
Настройте :ssh
бэкэнд, установив следующие свойства:
set :backend, :ssh
set :host, ENV['TARGET_HOST']
В приведенном выше фрагменте хост для подключения передается с использованием переменных среды (возможно, настроенных с помощью Rake)
Если вам требуется более точный контроль над ssh-соединением, например, с использованием ключей SSH или ProxyCommand, вам необходимо добавить set :ssh_options, options
Пример: требуется 'net/ssh'
# ...
host = ENV['TARGET_HOST']
#Configure SSH options
options = Net::SSH::Config.for(host)
options[:user] = ENV['USER']
options[:port] = 22
options[:keys] = ENV['TARGET_PRIVATE_KEY']
# Configure serverspec with the target host and SSH options
set :host, host
set :ssh_options, options