Ruby 如何对字符串进行数字比较
我编写了一个serverspec测试,旨在检查服务器上的ram量是否大于或等于属性文件中列出的装载量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设置
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
上玩了一会儿,找不到任何直接实现您需求的方法。因此,我建议您使用monkeypatchString
:
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
。