Rails-使用rspec功能的单例类麻烦

我在测试依赖于Singleton类的功能时遇到问题。该类(ERPDao)是具有不同方法的套件,可帮助应用程序使用法拉第gem与外部ERPvíaREST服务进行连接。 URLMaker是用于构建请求字符串的帮助程序类。当我尝试运行依赖于此方法之一的功能规格时,我在rspec中收到以下消息:

 Failure/Error: result = ERPDao.instance.get_credit_info(erp_id)

 NoMethodError:
   undefined method `instance' for ERPDao:Class
   Did you mean?  instance_of?
   Did you mean?  instance_of?

我的班级ERPDao

class ERPDao
def initialize
    @end_points = EndPoint.first
    @connection = Faraday.new(:url => @end_points.url_base,request: {
      open_timeout: 10,# opening a connection
      timeout: 10         # waiting for response
    })
end
@@instance = ERPDao.new

def self.instance
    return @@instance
end

def get_credit_info(erp_id)
    begin
        return @connection.get URLMaker.instance.get_uri('credit_info',erp_id)
    rescue Faraday::Error::ConnectionFailed => e
        puts "Connection failed: #{e}"
        return 0,false,0
    end
end

    ...
end

我的rails_helper.rb

require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment',__FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'support/factory_bot'
require 'support/wait_for_ajax'
activeRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = false

  config.before :suite do
    Databasecleaner.strategy = :truncation
  end

  config.before :each do
    Databasecleaner.clean
  end
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
  config.include Warden::Test::Helpers

  config.include Devise::TestHelpers,type: :controller

  Shoulda::Matchers.configure do |config|
    config.integrate do |with|
      with.test_framework :rspec
      with.library :rails
    end
  end
  Capybara.javascript_driver = :webkit

  Capybara::Webkit.configure do |config|
    config.debug = false
    config.allow_unknown_urls
    config.skip_image_loading
    config.timeout = 15
    config.raise_javascript_errors = false
  end
end

我的rails版本是4.2.6,ruby 2.3.1,factory_bot 4.8.2和rspec-rails 3.7。 有人知道这个错误吗? 谢谢!

wish4star 回答:Rails-使用rspec功能的单例类麻烦

在其他地方也定义了ERPDao。也许有人决定通过重新打开像这样的类来为其添加方法
class ERPDao
  def some_new_method
    ...
  end
end

不要那样做。使用模块并添加前缀。

module HasMyNewMethod
  def some_new_method
    ...
  end
end
ERPDau.prepend HasMyNewMethod

否则,您最终会意外地引用该类的重新打开,并且该类成为了定义-因此,自动加载器由于已定义而不会加载它。

在您的代码库中搜索“ ERPDao类”。修改那些不是初始声明的变量。

本文链接:https://www.f2er.com/3100248.html

大家都在问