2016-06-20 9 views
1

Iはinifile宝石を使用してServerspec試験を持っている:「未定義の方法 `[]」ゼロの場合:NilClass」エラー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 

rakeのいずれか(マシン上でローカルに実行された場合にテストに合格UbuntuゲストまたはOS Xホストの場合、inifile gemがインストールされています)。しかし

、私はベイグラントボックスに対してrakeを実行する(すなわち、ベイグラント上のUbuntuにSSHで接続するホスト上で)、それは次のメッセージで失敗します。

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 

それはエスケープ文字ではないとの問題のいくつかの種類のように私には思われるが、私は本当にわかりません。

何が間違っていますか?

+1

あなたの迷彩のインスタンス。そこからトラブルシューティングを開始します。また、 'file_ini = IniFile.load(file)'はほぼ確実にローカルで実行され、リモートでは実行されません。 –

+0

興味深い...それがローカルコールの場合は、すべて意味があります。しかし、その後、Serverspecはどのようにリモートで動作しますか?チェック...はい、ホスト上でローカルにファイルを作成すると、他のタスクがリモートで実行されても機能します。 – techraf

答えて

1

inifileがベイグラントインスタンスにインストールされていることを確認した後、これを行うのではなく無粋な方法は、このようなものになるだろう:file変数のスコープは、その内部で作業するかどうかはわからない

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 

command私はそれを安全に演奏しました。

Asker 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 
+1

すごく、私は再び更新します。 –

+0

これは、 'ruby 1.9.3'のシンボルキーと値のペアが' symbol_key:value'という新しい構文を持っているからです。それについてのスタックオーバーフローのどこかには、非常に詳細な説明があります。良いコールアウト。 –

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

例: は「ネット/ ssh」を必要とエラーがで行われたときにfile_ini`は、この試験では、未定義/ nilである `ことを語っている

# ... 

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 
関連する問題