Ruby on rails 在gem中测试ActiveRecord模型?

Ruby on rails 在gem中测试ActiveRecord模型?,ruby-on-rails,activerecord,rspec,gem,Ruby On Rails,Activerecord,Rspec,Gem,我正在尝试将Rails 3.2.3应用程序中的一组模型提取到gem中,以便它们可以用作应用程序之间的共享接口 我将模型移动到一个模块中,并将其放在lib/invite\u interface/invite.rb中 module InviteInterface class Invite < ActiveRecord::Base belongs_to :user end def to_json; end; def from_json; end; end 不幸的是,我

我正在尝试将Rails 3.2.3应用程序中的一组模型提取到gem中,以便它们可以用作应用程序之间的共享接口

我将模型移动到一个模块中,并将其放在lib/invite\u interface/invite.rb中

module InviteInterface
  class Invite < ActiveRecord::Base
    belongs_to :user
  end

  def to_json; end;
  def from_json; end;
end
不幸的是,我无法在模型上执行rspec,因为activerecord/rspec需要一个活动连接

1) InviteInterface::Invite should belong to encounter survey set
   Failure/Error: subject.should respond_to(:user)
   ActiveRecord::ConnectionNotEstablished:
     ActiveRecord::ConnectionNotEstablished
   # /Users/justin/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:398:in `retrieve_connection'
   # /Users/justin/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:168:in `retrieve_connection'
   # /Users/justin/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:142:in `connection'
   # /Users/justin/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.3/lib/active_record/model_schema.rb:228:in `columns'
   # /Users/justin/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.3/lib/active_record/model_schema.rb:243:in `column_defaults'

如何防止ActiveRecord查找DB连接?

无论如何,您都需要使用数据库测试库,因此您最好使用内存中的SQLite数据库进行测试。只需将其添加到
spec\u helper.rb

ActiveRecord::Base.establish_connection(:adapter => "sqlite3", 
                                       :database => ":memory:")
并按如下方式创建模式:

ActiveRecord::Schema.define do
  self.verbose = false

  create_table :invites, :force => true do |t|
    t.string :text
  end
  ...
end

我发现,如果您单独测试模型,那么在定义
ActiveRecord
连接时,您最好尝试使用SQLite3的内存中功能,以获得非常快速的规范:

ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :database => ':memory:'
)

试一试,它对我来说很有吸引力,而且让我的模型测试得更快。

谢谢Yuri,这最终对我来说很有效(尽管由于sqlite3的问题,我不得不从rspec转到minitest),这很好,特别是使用下面的选项:database=>':memory:“@juwiley您能根据您的经验建议我应该使用minitest还是rspec吗?这是个人偏好Saad,我使用rspect这对在内存中创建简单的测试环境数据库非常有帮助。很好的提示。
ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :database => ':memory:'
)