Тестирование моделей ActiveRecord внутри драгоценного камня?

Я пытаюсь извлечь набор моделей из приложения Rails 3.2.3 в гем, чтобы их можно было использовать в качестве общего интерфейса между приложениями.

Я переместил модель в модуль и поместил ее в lib/invite_interface/invite.rb

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

  def to_json; end;
  def from_json; end;
end

Я добавил rspec в gemfile, успешно запустил его и создал следующую спецификацию:

require 'spec_helper'

describe InviteInterface::EncounterSurvey do
  it 'should belong to user' do
    subject.should respond_to(:user)
  end

end

К сожалению, я не могу выполнить rspec на модели, потому что для Active Record/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 искать соединение с БД?


person Allyl Isocyanate    schedule 15.05.2012    source источник


Ответы (2)


В любом случае вам нужно протестировать свою библиотеку с базой данных, поэтому вы можете также использовать базу данных SQLite в памяти для тестирования. Просто добавьте это к spec_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
person Yuri Barbashov    schedule 15.05.2012
comment
Спасибо, Юрий, в конечном итоге это сработало для меня (хотя мне пришлось перейти на минитест с rspec из-за болезненных проблем с sqlite3) - person Allyl Isocyanate; 15.05.2012
comment
Это здорово, спец. с опцией снизу :database =› ':memory:' - person ghayes; 13.02.2013
comment
@juwiley, можете ли вы посоветовать, что мне следует использовать minitest или rspec, исходя из вашего опыта. - person Saad Masood; 12.05.2015
comment
Это личное предпочтение Саада, я использую rspec - person Allyl Isocyanate; 12.05.2015

Я обнаружил, что если вы тестируете свои модели изолированно, вы также можете попытаться использовать возможности SQLite3 в памяти при определении соединения ActiveRecord для получения очень быстрых спецификаций:

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

Попробуйте, это сработало для меня как шарм, и мои модели были протестированы намного быстрее.

person Attila Györffy    schedule 20.05.2012
comment
Это действительно полезно для создания простой базы данных тестовой среды в памяти. Отличный совет. - person ghayes; 13.02.2013