неопределенная локальная переменная в chefspec для метода, включенного в gem - PullRequest
1 голос
/ 24 октября 2019

Я включаю драгоценный камень в поваренную книгу шеф-повара. Независимо от того, что я пробовал, я получаю подобные ошибки с неопределенной локальной переменной или методом `host '

Я пробовал много разных вариантов этого.

allow(HostOpsCookbook).to receive(:host).with(:sonic.version).and_return('10.0')

Макет Gem cust_gem \lib \ibus \host sonic.rb host.rb

host.rb

module Ibus
  class Host
   attr_reader :sonic

    def initialize
      extend_type
    end

    def enxtend_type
      @sonic = Ibus::Host::Sonic.new
    end

  end
end

host \ sonic.rb

module Ibus
  class Host
    class Sonic

      def version
         .....
      end
  end
 end
end

Поваренная книга шеф-повара cookbook \libraries host_helper.rb \recipes default.rb

chef \ cookbook \ library\ host_helper.rb

module HostOpsCookbook
  def host
    require_ibus_gem #Loads the gem
    @@host ||= Ibus::Host.new
  end
end

Chef::Recipe.send(:include, HostOpsCookbook) if defined?(Chef::Recipe)
Chef::Resource.send(:include, HostOpsCookbook) if defined?(Chef::Resource)
Chef::Provider.send(:include, HostOpsCookbook) if defined?(Chef::Provider)

chef \ cookbook \ recipes \ default.rb

sonic_version = host.sonic.version

Так работает код, работает метод gem.

ОднакоЯ не могу понять, как заглушить ниже в тестах спецификации.

host.sonic.version

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Приведенный ниже код работал. Метод version был вложен в хост / модуль Sonic / Class, который расширяется при инициализации хост-объекта. Это все показано выше.

allow_any_instance_of(HostOpsCookbook).to receive_message_chain(:host, :sonic, :version).and_return('10.0')

0 голосов
/ 31 октября 2019
allow(HostOpsCookbook).to

Для методов класса заглушки. На самом деле у вас есть метод экземпляра, поэтому вы должны использовать:

allow_any_instance_of(<Class>).to 

Ваш метод хоста определен в модуле, вы не можете создать экземпляр из модулей. Таким образом, вы должны заглушить экземпляр объекта Chef :: Recipe, так как вы вызываете метод host из рецепта.

allow_any_instance_of(Chef::Recipe).to 

Другая проблема - это заглушение sonic.version. Когда вы пытаетесь использовать цепочку, вы должны использовать rspec doubles в этом случае.

Таким образом, конечный результат должен быть:

sonic_double = double("Sonic Double", version: "10.0")
allow_any_instance_of(Chef::Recipe).to receive(:host).and_return(sonic_double)
0 голосов
/ 31 октября 2019
...