Тестване на модели на 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 да търси връзка с DB?


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
Благодаря Юри, това в крайна сметка проработи за мен (въпреки че трябваше да премина към minitest от 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