2013-03-05 7 views
6

Ich bin ziemlich neu in Ruby, aber ich habe in den letzten zwei Wochen eine Menge Forschung über Chef-Tests gemacht. Dieser Test verwendet ChefSpec & Fauxhai, aber es sieht nicht sehr "Ruby-ish" aus und ich hatte gehofft, dass die Community mir einige Hinweise zum Coding-Stil geben könnte. Gibt es eine bessere Möglichkeit, eine verschachtelte Schleife so zu schreiben?Feedback zu Ruby/ChefSpec Codierungsstil

Kochbücher/foo/Rezepte/default.rb

package "foo" do 
    action :install 
end 

Kochbücher/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 

Jedwedes Feedback ist willkommen. Vielen Dank!

+2

https://github.com/bbatsov/ruby-style-guide ist eine gute allgemeine Ressource für vorgeschlagene Ruby Codierungsrichtlinien. Ich glaube nicht, dass Sie viel tun können, um diese verschachtelten Schleifen zu bereinigen, während die Lesbarkeit erhalten bleibt. –

+0

Ich habe den Leitfaden gelesen, aber ich sehe nicht viel, was ich verbessern kann. Danke für die Rückmeldung! – Rapsey

Antwort

6

Zuerst ist eine übliche Praxis, ChefRunner Instanziierung zu let Helfer zu extrahieren. Sie können auch alle Fauxhai Konfiguration sind es:

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 

Die expect Syntax scheint recommended über should zu sein. Aber in diesem Beispiel würde ich eine Einzeiler verwenden:

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

Um die Schleife ein bisschen aufzuräumen können Sie RSpec's shared examples verwenden. Ein bisschen mehr extended Beispiel:

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

Eine andere Möglichkeit wäre die Verwendung von RSpec-Tags ('describe 'foo', Plattformen: [...] do ...') und die darauf basierenden gemeinsamen Beispiele zu durchlaufen. –