我正在尝试通过使用SQLite3内存数据库作为应用程序的测试数据库来加速Rails应用程序的测试。我已按照此blog post中的说明进行操作。
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
初始化程序确实加载了数据库(正如您从输出的第一行看到的那样),但由于某种原因,模式对于测试是不可见的,因为它看起来在错误的位置或者因为它已被擦除到测试开始的时候。
之前有人见过这个吗?
答案 0 :(得分:2)
看看有关共享连接的信息:
http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
sqllite维护每个连接的内存数据库。活动记录使用连接池,当您运行测试时,它使用不同的连接。您可以在各个点检查连接的对象ID,以查看实际的对象更改。
如果你共享一个连接,你应该得到你期望的行为。
并且更快启动: - )
答案 1 :(得分:1)
将下面的代码放在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