首页 > 解决方案 > Ruby 中的存根文件

问题描述

我有这个 ruby​​ 方法,我想在 rspec 文件中存根:

  def load_environment_config(gateway, trx_type)
    @config = YAML.load_file("config/#{env}.yml")["#{env.upcase}"]
    raise "\n\nMissing gateway configuration for #{gateway} in file config/#{env}.yml!\n" unless @config[gateway]
    @terminal = terminal_for(@config, gateway, trx_type)
    @url = URI.parse("#{@config['processing_url']}#{@terminal['token']}")
  end

我试过这个:

let(:request_builder) { described_class.new(env: nil) } 
  let(:trx_types)       { ['davivienda'] }
  let(:trx_type)        { 'davivienda' }
  let(:gateway)         { 'girogate' }
  let(:currency)        { 'USD' }
  let(:base_params)     { request_builder.send(:base_params) }

  before(:each) { allow(request_builder).to receive(:currency).and_return(currency) }

  let(:yaml_file) { YAML::load(File.read(File.join('spec', 'fixtures', 'yaml', 'test_env.yml'))) }
  let(:config)    { yaml_file['TEST_ENV'] }
  let(:successful_response_file) { File.read(File.join('spec', 'fixtures', 'xml', 'successful_response.xml')) }

  allow(request_builder).to receive(:currency).and_return('EUR') 
  allow(request_builder).to receive(:env).and_return('TEST_ENV') 
  allow(request_builder).to receive(:config).and_return(config) 
  allow(request_builder).to receive(:base_params).and_return(base_params)
  allow(request_builder).to receive(:gateway).and_return(gateway)  
  allow(request_builder).to receive(:request_builder)

但是当我运行 rspec 代码时,我得到了这个:

Errno::ENOENT:
       No such file or directory @ rb_sysopen - config/TEST_ENV.yml
     # ./models/request_builder.rb:50:in `load_environment_config'
     # ./models/request_builder.rb:45:in `filter_trx_types_list_for'
     # ./models/request_performer.rb:8:in `process_trx'
     # ./models/request_builders/girogate_request_builder.rb:81:in `block in submit!'
     # ./models/request_builders/girogate_request_builder.rb:80:in `each'
     # ./models/request_builders/girogate_request_builder.rb:80:in `submit!'
     # ./spec/models/request_builders/girogate_request_builder_spec.rb:42:in `block (3 levels) in <top (required)>'

我的想法是存根变量配置并使用位于 spec 目录中的 yaml 文件。什么是覆盖的正确方法@config

标签: rubyrspec

解决方案


也许您可以使用 rails 方法来获取正确的环境,例如:

file_path = File.join(Rails.root, 'config', "#{Rails.env}.yml"
@config = YAML.load_file(filepath)["#{Rails.env.upcase}"]

因此,您至少需要三个新文件:

{root}/config/test.yml
{root}/config/development.yml
{root}/config/production.yml

有了这个,你不应该需要存根文件加载过程


推荐阅读