簡體   English   中英

導軌 - Singleton class 故障與 rspec 功能

[英]Rails - Singleton class troubles with rspec feature

我在測試依賴於 Singleton class 的功能時遇到問題。 class (ERPDao) 是一個具有不同方法的套件,可幫助應用程序使用 Faraday gem 通過 REST 服務與外部 ERP 連接。 URLMaker 是構建請求字符串的助手 class。 當我嘗試運行依賴於其中一種方法的功能規范時,我在 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?

我的 class 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。 有人知道這個錯誤嗎? 謝謝!

ERPDao [也] 在其他地方被定義。 也許有人決定通過重新打開 class 來添加一個方法

class ERPDao
  def some_new_method
    ...
  end
end

不要那樣做。 改用模塊和前置。

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

否則,您最終會意外引用 class 的重新打開並成為定義 - 因此自動加載器不會加載它,因為它已經定義。

在您的代碼庫中搜索“class ERPDao”。 修改那些不是初始聲明的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM