Ruby 如何对字符串进行数字比较

Ruby 如何对字符串进行数字比较,ruby,rspec,serverspec,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设置

我编写了一个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) std命令“perl-n-e”如果(/MemTotal:\s+(\d+/){print\$1;last;})/proc/meminfo“stdout应该大于等于888
在主机“foo.bar.org”上
失败/错误:它的(:stdout){应该是>=“#{property['ram']}”
参数错误:
将字符串与888进行比较失败
sudo-p“Password:”/bin/sh-c perl \-n \-e \“if \(/MemTotal:\\s \+\(\\d \+\)/\)\{\print\\\\\$1\;\last\\\\\\\\\\\\\”\/proc/meminfo
7539944
共享示例组:./spec/std/spec.rb:5调用的“ram::init”
#./spec/shared/ram/init.rb:4:in'block(3层)in'

此工具运行在旧商品
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
顺便说一句,ruby的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']}" }

希望能有所帮助。

我想你自己已经给出了答案:如果你想把字符串作为整数进行比较,请用
将字符串转换成整数。to_I
应该是>=property['ram']。to_I;它能工作吗?我不知道如何将its(:stdout)转换成整数,甚至不知道如何从中获取值<代码>>=property['ram']。to_i对于RHS很好,但由于LHS是字符串,因此给出了一个类型错误。我不确定我是否可以像serverspec一样使用backtick。
命令
“type”被包装并通过ssh在远程服务器上运行。ssh’ing由serverspec控制。很高兴您喜欢perl:)thx!这很有效,我很喜欢。当然,我也找到了另一个解决办法。使用“expect”语法而不是“should”
expect(subject.stdout.to_i).to be>=“{property['ram']}”。to_i
确实有效。我不知道用“应该”怎么做我怀疑你会成功,这就是为什么在现代
rspec
s中
should
语法改为
expect