Тестирование Chef Library с помощью shell_out - PullRequest
1 голос
/ 04 февраля 2020

Я пишу пользовательский ресурс для Chef. Ресурс используется для установки значений sysctl. Я в основном использую код Chef sysctl и накладываю на него некоторые ограничения. Мы не доверяем всем пользователям компании: P

Я пытаюсь поместить большую часть кода в вспомогательный модуль библиотеки, чтобы упростить тестирование кода. Я не уверен, что это лучшая практика. Дайте мне знать, если это плохая практика.

В любом случае, проблема, с которой я сталкиваюсь, заключается в попытке проверить код моей библиотеки. Всякий раз, когда я пытаюсь смоделировать команду shell_out, я всегда получаю следующую ошибку:

1) Sysctl::Helpers.set_sysctl_param
     Failure/Error: subject.set_sysctl_param("key1", "value1")

     NoMethodError:
       undefined method `shell_out!' for Sysctl::Helpers:Module

Код библиотеки

module Sysctl
  module Helpers
    include Chef::Mixin::ShellOut
    def self.set_sysctl_param(key, value)
      shell_out!("sysctl -w \"#{key}=#{value}\"")
    end
  end
end

Проверка

require 'spec_helper'
describe Sysctl::Helpers do
  describe '.set_sysctl_param' do
    let(:shellout) { double(run_command: nil, error!: nil, stdout: '', stderr: double(empty?: true)) }
    before do
      allow(Chef::Mixin::ShellOut).to receive(:new).and_return(shellout)
    end

    it do
      subject.set_sysctl_param("key1", "value1")
      expect(:shellout).to receive(:run_command).with("sysctl -w \"key1=value1\"")
    end
  end
end

Я ценю любую помощь или советую, вы можете дать мне.

Спасибо!

1 Ответ

1 голос
/ 04 февраля 2020

Когда вы включаете модуль, вы добавляете методы модуля в качестве методов экземпляра. Но вы пытаетесь получить доступ к shell_out в методе класса. Вам действительно нужно расширить ваш модуль с помощью Chef :: Mixin :: ShellOut. Таким образом методы ShellOut будут добавлены как методы класса.

module Sysctl
  module Helpers
    extend Chef::Mixin::ShellOut  # replace include with extend
    def self.set_sysctl_param(key, value)
      shell_out!("sysctl -w \"#{key}=#{value}\"")
    end
  end
end

Подробнее об этом В чем разница между include и extension в Ruby?

...