RSpec - 调用应该被模拟的私有方法的测试方法

时间:2016-10-01 01:19:31

标签: 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. make read_config_from_yml public

  2. 为config添加setter方法(以避免模拟实例变量)

  3. 这些是黑客吗?还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

一个想法是在测试中实际创建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

这样可以避免任何存根,并允许您将方法保密。