如何对字符串

时间:2015-10-30 12:36:27

标签: ruby rspec serverspec

我编写了一个serverspec测试,用于检查服务器上的ram数量是否大于或等于属性文件中列出的安装量

   describe command('perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo') do
     its(:stdout){ should be >= "#{property['ram']}"}
    end

在我正在测试的机器上给出“7539944”

如果属性ram设置为“888”,则测试错误地失败,因为字符串比较“888”大于“7539944”

有没有我可以在serverspec中对字符串类型进行数字比较?

这个irb会话显示了我如何相信ruby的行为以及我希望它如何表现

$ irb
1.9.3-p484 :001 > prop="888"
 => "888" 
1.9.3-p484 :002 > command="7539944"
 => "7539944" 
1.9.3-p484 :003 > command > prop
 => false 
1.9.3-p484 :004 > command.to_i > prop.to_i
 => true 

如果我改变了对此的描述

describe command('perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo') do
 its(:stdout){ should be >= "#{property['ram']}".to_i}
end

我收到此错误

Failures:

      1) std Command "perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo" stdout should be >= 888
         On host `foo.bar.org'
         Failure/Error: its(:stdout){ should be >= "#{property['ram']}".to_i}
         ArgumentError:
           comparison of String with 888 failed
           sudo -p 'Password: ' /bin/sh -c perl\ -n\ -e\ \"if\ \(/MemTotal:\\s\+\(\\d\+\)/\)\ \{\ print\ \\\$1\;\ last\;\ \}\"\ /proc/meminfo
           7539944
         Shared Example Group: "ram::init" called from ./spec/std/spec.rb:5
         # ./spec/shared/ram/init.rb:4:in `block (3 levels) in <top (required)>'

1 个答案:

答案 0 :(得分:2)

此工具在旧版rspec上运行。执行此任务不需要DSL:

context 'memory' do
  it "should be greater than #{888}" do
    expect(`cat /proc/meminfo`[/MemTotal:\s+(\d+)/, 1].to_i).to be >= 888 
  end 
end

来自红宝石的Perl调用使我的日子顺便说一下,顺便说一句。

UPD 我与serverspec玩了一下,我发现你的要求没有直接实现。因此,我建议你以这种方式进行monkeypatch String

class String
  def greater_than? other
    to_i > other.to_i rescue false
  end
end

这样你就可以在你的场景中写作:

its(:stdout) { should be_greater_than "#{property['ram']}" }

希望它有所帮助。