关于Ruby/ChefSpec编码风格的反馈
我对Ruby比较陌生,但在过去的两周里,我一直在做很多关于厨师测试的研究。这个测试使用ChefSpec和Fauxhai,但它看起来不太像“ruby-ish”,我希望社区能给我一些关于编码风格的建议。有没有更好的方法来编写这样的嵌套循环 烹饪书/foo/recipes/default.rb关于Ruby/ChefSpec编码风格的反馈,ruby,rspec,chef-infra,chefspec,Ruby,Rspec,Chef Infra,Chefspec,我对Ruby比较陌生,但在过去的两周里,我一直在做很多关于厨师测试的研究。这个测试使用ChefSpec和Fauxhai,但它看起来不太像“ruby-ish”,我希望社区能给我一些关于编码风格的建议。有没有更好的方法来编写这样的嵌套循环 烹饪书/foo/recipes/default.rb package "foo" do action :install end 烹饪书/foo/spec/default_spec.rb require 'chefspec' describe 'foo::d
package "foo" do
action :install
end
烹饪书/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
欢迎任何反馈。谢谢大家! 首先,通常的做法是将
ChefRunner
实例化提取到let
helper。您还可以在此处包含所有Fauxhai配置:
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
expect
语法似乎已结束should
。但在本例中,我将使用一个内衬:
subject do
ChefSpec::ChefRunner.new(platform: platform, version: version).converge('foo::default')
end
it { should install_package 'foo' }
要稍微清理循环,可以使用。再扩展一点的示例:
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
是一个很好的Ruby编码指南的通用资源。我认为在保持可读性的同时,要清理这些嵌套循环,没有什么可以做的。我已经通读了指南,但也看不到有什么可以改进的。谢谢你的反馈!另一种方法可能是使用RSpec标记(
描述'foo',platforms:[…]do…
)并基于此循环共享示例。