1

我有一个使用inifile gem 的 Serverspec 测试:

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

如果在机器上本地执行测试通过(在安装 gem 的rakeUbuntu 客户机或 OS X 主机上)。inifile

但是,当我在rakeVagrant 机器上运行时(即在通过 SSH 连接到 Vagrant 上的 Ubuntu 的主机上),它会失败并显示以下消息:

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)>'

我使用 Serverspec 的默认值Rakefilespec_helper.rb.

/tmp/testfile1.ini如下,尽管无论内容如何测试都失败:

[section1]
variable1=value1

在我看来,字符未转义似乎存在某种问题,但我不太确定。

有什么问题?

4

2 回答 2

1

在确保将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方法中工作,所以我玩得很安全。

inifile鉴于对API的深入了解,Asker techraf 添加了这条更简洁的路线。

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
于 2016-06-20T12:11:14.553 回答
0
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
于 2017-03-08T03:32:49.243 回答