Ошибка "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
Другие вопросы по тегам