未定义的方法'扫描' for nil:NilClass(NoMethodError)

时间:2016-08-17 14:57:45

标签: ruby inspec

坚持这个,这个布局是为了厨师inspec测试,但利用ruby来抓取文件的内容。但是,通过此测试,我实际上并未对文件进行测试,因此我试图了解如何解释该问题,以下是代码:

%w(/etc/bashrc /etc/profile).each do |path|
file(path).content.scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask| 
 BASELINE = '0027'
 (1..3).each do |i| # leading char is '0' octal indicator
    describe umask[i].to_i do
        it { should be <= BASELINE[i].to_i }
     end
    end
   end
  end
end

这是给我带来麻烦的一线

file(path).content.scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask|

2 个答案:

答案 0 :(得分:0)

您可以将file(path).content更改为与文件内容匹配的字符串。

"Sample_string".scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask|

如果您没有针对真实文件进行测试,原因是file(path).content会返回nil。并且nil没有scan方法,这就是您收到错误的原因。

答案 1 :(得分:0)

就错误而言,即&#34; 未定义的方法&#39; scan&#39;对于nil:NilClass &#34;,只有正在传递的文件在文件系统上不存在或不可读时,才会出现此错误。

另外,提供的信息不完整,因为不清楚两个文件中设置的umask是什么,即它是3位数还是4位数?

因为在进行扫描时你正在寻找3位数的umask&#34; 扫描(/ ^ \ s umask \ s +(\ d {3})\ b /)* < /强>&#34;并且您已设置&#34; BASELINE =&#39; 0027&#39; &#34;这是4位数的。所以,它肯定会有问题。

如果你有&#34; umask 027 &#34;在文件中,它应该是: 检查 BASELINE =&#39; 027&#39; ,搜索3位数的umask

%w(/etc/bashrc /etc/profile).each do |path|
  file(path).content.scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask| 
   BASELINE = '027'
   (1..3).each do |i| # leading char is '0' octal indicator
      describe umask[i].to_i do
        it { should be <= BASELINE[i].to_i }
      end
   end
 end
end

否则你有&#34; umask 0027 &#34;在文件中,它应该是:

检查扫描(/ ^ \ s * umask \ s +(\ d {4})\ b /),搜索4位数的umask

%w(/etc/bashrc /etc/profile).each do |path|
  file(path).content.scan(/^\s*umask\s+(\d{4})\b/).flatten.each do |umask| 
   BASELINE = '027'
   (1..3).each do |i| # leading char is '0' octal indicator
      describe umask[i].to_i do
        it { should be <= BASELINE[i].to_i }
      end
   end
 end
end