#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
, потому что это будет мешать работе с внутренними компонентами объекта.
Что я могу придумать на моей голове:
-
сделайте read_config_from_yml общедоступным
-
добавьте метод 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
Это позволит избежать каких-либо блокировок и позволит вам сохранить ваш метод закрытым.