Почему мои тесты Rails не видят содержимое моей базы данных SQLite3 в памяти? - PullRequest
4 голосов
/ 27 марта 2012

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

Моя конфигурация базы данных в database.yml выглядит следующим образом:

test:
  adapter: sqlite3
  database: ":memory:"
  encoding: utf8
  verbosity: quiet

Я также создал инициализатор, как рекомендовано:

def in_memory_database?
  Rails.env == "test" and
    ActiveRecord::Base.connection.class == ActiveRecord::ConnectionAdapters::SQLiteAdapter ||
      ActiveRecord::Base.connection.class == ActiveRecord::ConnectionAdapters::SQLite3Adapter and
    Rails.configuration.database_configuration['test']['database'] == ':memory:'
end

if in_memory_database?
  ActiveRecord::Schema.verbose = false
  puts "creating sqlite in memory database"
  load "#{Rails.root}/db/schema.rb"
end

Все мои тесты не пройдены, поскольку приборы не могут быть загружены, как вы можете видеть:

creating sqlite in memory database
Loaded suite test/unit/vendor_appliance_test
Started
E
Finished in 0.070079 seconds.

  1) Error:
test_the_truth(VendorApplianceTest):
ActiveRecord::StatementInvalid: Could not find table 'advertisers'


1 tests, 0 assertions, 0 failures, 1 errors

Инициализатор загружает базу данных (как вы можете видеть из первогострока вывода), но по какой-то причине схема не видна тестам, либо потому, что она выглядит не в том месте, либо потому, что была стерта к моменту начала тестов.

Кто-нибудь видел это раньше

Ответы [ 2 ]

2 голосов
/ 07 апреля 2012

Посмотрите на это об общих подключениях:

http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/

sqllite поддерживает дБ в памяти на соединение.активная запись использует пул соединений, а при запуске теста используется другое соединение.вы можете проверить идентификаторы объектов в различных точках, чтобы увидеть фактические изменения объекта.

если вы используете одно соединение, вы должны получить ожидаемое поведение.

и быстрееboot: -)

1 голос
/ 02 июля 2013

Просто поместите код ниже в test_helper.rb

def in_memory_database?
    ActiveRecord::Base.connection.class == ActiveRecord::ConnectionAdapters::SQLiteAdapter ||
    ActiveRecord::Base.connection.class == ActiveRecord::ConnectionAdapters::SQLite3Adapter and
    Rails.configuration.database_configuration['test']['database'] == ':memory:'
end

class ActiveSupport::TestCase
    if in_memory_database?
        ActiveRecord::Schema.verbose = false
        puts "creating sqlite in memory database"
        load "#{Rails.root}/db/schema.rb"
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...