RSpec — методы тестирования, которые вызывают частные методы, которые должны быть издевались

#ruby-on-rails #ruby-on-rails-4 #rspec #rspec-rails #rspec3

#ruby-on-rails #ruby-on-rails-4 #rspec #rspec-rails #rspec3

Вопрос:

Я использую RSpec для тестирования своих классов на Rails.

Мне интересно, каков хороший способ тестирования методов, вызывающих частные методы.

Например, у меня есть этот класс:

 Class Config
  def configuration(overrides)
    @config.merge(overrides)
  end

  private

  def read_config_from_yml
    @config ||= YAML.load()...
  end
end
  

Чтобы протестировать метод конфигурации, нам нужно каким-то образом смоделировать метод read_config_from_yml . Я знаю, что нехорошо просто издеваться над частным методом read_config_from_yml или переменной экземпляра @config , потому что это будет мешать работе с внутренними компонентами объекта.

Что я могу придумать на моей голове:

  1. сделайте read_config_from_yml общедоступным

  2. добавьте метод setter для конфигурации (чтобы избежать подделки переменной экземпляра)

Это хаки? Есть еще идеи?

Ответ №1:

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

 before do
  File.open(file_path_here, 'w ') do |f|
    f << <<-eof
      config:
        setting1: 'string'
        setting2: 0
    eof
  end
end

after do
  File.delete(file_path_here)
end

it 'does the thing' do
  ...
end
  

Это позволит избежать каких-либо блокировок и позволит вам сохранить ваш метод закрытым.