首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Ruby / ChefSpec编码风格的反馈

关于Ruby / ChefSpec编码风格的反馈
EN

Stack Overflow用户
提问于 2013-03-05 21:42:08
回答 1查看 1.4K关注 0票数 6

我对Ruby比较陌生,但在过去的两周里,我已经做了很多关于Chef测试的研究。这个测试使用了ChefSpec & Fauxhai,但它看起来不是很“红宝石”,我希望社区能给我一些关于编码风格的建议。有没有更好的方法来编写像这样的嵌套循环?

cookbooks/foo/recipes/default.rb

代码语言:javascript
复制
package "foo" do
  action :install
end

cookbooks/foo/spec/default_spec.rb

代码语言:javascript
复制
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

欢迎任何和所有的反馈。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-03 01:28:35

首先,一种常见的做法是将ChefRunner实例化提取到let助手中。您还可以在其中包含所有Fauxhai配置:

代码语言:javascript
复制
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语法似乎是recommended over should。但在本例中,我将使用一行代码:

代码语言:javascript
复制
subject do
  ChefSpec::ChefRunner.new(platform: platform, version: version).converge('foo::default')
end
it { should install_package 'foo' }

要清理一下循环,可以使用RSpec's shared examples。一个更广泛的例子:

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15225283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档