2013-03-05 9 views
6

Sono piuttosto nuovo per Ruby, ma ho fatto molte ricerche sui test degli Chef nelle ultime due settimane. Questo test utilizza ChefSpec & Fauxhai, ma non sembra molto "rubino-ish" e speravo che la community potesse darmi alcuni suggerimenti sullo stile di codifica. C'è un modo migliore per scrivere un ciclo annidato come questo?Feedback sullo stile di codifica Ruby/ChefSpec

libri di cucina/foo/Ricette/default.rb

package "foo" do 
    action :install 
end 

libri di cucina/foo/spec/default_spec.rb

require 'chefspec' 

describe 'foo::default' do 
    platforms = { 
    "debian" => ['6.0.5'], 
    "ubuntu" => ['12.04', '10.04'], 
    "centos" => ['5.8', '6.0', '6.3'], 
    "redhat" => ['5.8', '6.3'], 
    "mac_os_x" => ['10.6.8', '10.7.4', '10.8.2'], 
    "windows" => ['2008R2'] 
    } 

    platforms.each do |platform,versions| 
    versions.each do |version| 
     context "on #{platform} #{version}" do 
     before do 
      Fauxhai.mock(platform: platform, version: version) 
     end 

     it 'should install foo' do 
      @runner = ChefSpec::ChefRunner.new.converge('foo::default') 
      @runner.should install_package 'foo' 
     end 
     end 
    end 
    end 
end 

Qualsiasi e tutti i feedback è benvenuto. Grazie!

+2

https://github.com/bbatsov/ruby-style-guide è una buona risorsa generale per le linee guida suggerite per la codifica di Ruby. Non penso che ci sia molto che potresti fare per ripulire questi cicli annidati mantenendo la leggibilità. –

+0

Ho letto la guida ma non vedo molto che possa migliorare. Grazie per il feedback! – Rapsey

risposta

6

In primo luogo, una pratica comune è estrarre l'istanza ChefRunner nell'helper let. È inoltre possibile includere tutta la configurazione Fauxhai lì:

let(:chef_run) do 
    ChefSpec::ChefRunner.new(platform: platform, version: version) do |node| 
    node.set['foo']['bar'] = 'baz' 
    # .... 
    end.converge('foo::default') 
end 

it "installs foo" do 
    expect(chef_run).to install_package 'foo' 
end 

La sintassi expect sembra essere recommended sopra should. Ma in questo esempio, vorrei usare una battuta:

subject do 
    ChefSpec::ChefRunner.new(platform: platform, version: version).converge('foo::default') 
end 
it { should install_package 'foo' } 

per ripulire il looping un po 'è possibile utilizzare RSpec's shared examples. Un esempio un po 'più esteso:

require 'chefspec' 

shared_examples 'foo' do |platform, version| 
    context "on #{platform} #{version}" do 
    let(:users) { %w[user1 user2] } 
    let(:chef_run) do 
     ChefSpec::ChefRunner.new(platform: platform, version: version) do |node| 
     node.set['foo']['users'] = users 
     end.converge('foo::default') 
    end 
    subject { chef_run } 

    it { should install_package 'foo' } 

    it "creates specified users" do 
     users.each { |u| expect(chef_run).to create_user u } 
    end 
    end 
end 

describe 'foo::default' do 
    platforms = { 
    'debian' => ['6.0.5'], 
    'ubuntu' => ['12.04', '10.04'], 
    'centos' => ['5.8', '6.0', '6.3'], 
    'redhat' => ['5.8', '6.3'], 
    'mac_os_x' => ['10.6.8', '10.7.4', '10.8.2'], 
    'windows' => ['2008R2'] 
    } 

    platforms.each do |platform, versions| 
    versions.each do |version| 
     include_examples 'foo', platform, version 
    end 
    end 
end 
+0

Un altro modo potrebbe essere l'uso dei tag RSpec ('describe 'foo', piattaforme: [...] do ...') e loop degli esempi condivisi basati su questo. –

Problemi correlati