2016-08-17 5 views
0

Застрял на этом, этот макет для теста проверки шеф-повара, но использует рубин для захвата содержимого файла. Однако с этим тестом я на самом деле не тестируется на файл, так что я пытаюсь понять, как объяснить, что, Херес код:Неопределенный метод «сканировать» для nil: NilClass (NoMethodError)

%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| 

ответ

0

Насколько касается ошибки, то есть, «Неопределенный метод„сканировать“на ноль: NilClass», эта ошибка будет только придумать, делая Inspec бег, если файлы, которые пропускают , либо отсутствуют, либо не читаются в файловой системе.

Кроме того, предоставленная информация не является полной, так как неясно, что то, что задает umask в обоих файлах, т. Е. Это 3 цифры или 4 цифры?

Поскольку при выполнении сканирования вы ищете 3 цифр UMASK "сканирования (/^\ s Umask \ s + (\ d {3}) \ б /) *" и вы установили "BASELINE = '0027' ", который является 4-значным. Таким образом, это определенно будет иметь проблему.

Если у вас есть "UMASK 027" в файлах, то он должен быть: Проверить BASELINE = '027', поиск 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 

Else у вас есть " Umask 0027 "в файлах, то он должен быть:

Проверить сканирование (/^\ 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 
0

Вы можете изменить file(path).content на строку, которая соответствует любому содержимому файла.

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

Причина в том, file(path).content возвращается nil если вы не сравниваете реальный файл. И nil не имеет метода scan, поэтому вы получаете ошибку.

Смежные вопросы