Rspec - Neo4j.rb 8.0.13 的数据库清理器

Rsepc - Database cleaner with Neo4j.rb 8.0.13

使用旧版本的 neo4j 和 eno4j.rb 一切正常

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
    DatabaseCleaner[:neo4j, connection: { type: :server_db, path: ENV['TEST_GRAPHENEDB_URL'] }].strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner[:neo4j, connection: { type: :server_db, path: ENV['TEST_GRAPHENEDB_URL'] }].strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner[:neo4j, connection: { type: :server_db, path: ENV['TEST_GRAPHENEDB_URL'] }].strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
    DatabaseCleaner[:neo4j, connection: { type: :server_db, path: ENV['TEST_GRAPHENEDB_URL'] }].start
  end

  config.after(:each) do
    DatabaseCleaner.clean
    DatabaseCleaner[:neo4j, connection: { type: :server_db, path: ENV['TEST_GRAPHENEDB_URL'] }].clean
  end
end

使用新版本的 Neo4j 升级后 Neo4j.rb 我更改了这个文件

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
    Neo4j::ActiveBase.current_session.query('MATCH (n) DETACH DELETE n')
  end
end

这是我的数据库清理器文件,我在我的项目中使用了 postgres 和 neo4j 我在查看后完成了这个 http://neo4jrb.readthedocs.io/en/8.0.x/Miscellany.html#cleaning-your-database-for-testing 我在 运行 测试用例

时遇到问题
 Neo4j::PendingMigrationError:
   Migrations are pending:
   20170324201940
   20170324202013
   20170324202025
   20170324202040
   20170324202053
   20170324202110
   20170324202522
   20170324202604
   20170324202801
   20170328203203

我建议完全摆脱 DatabaseCleaner。它提供了三种不同形式的数据库清理,但只有一种真正适用于 Neo4j,因此没有太大意义(参见 this page)。

如果您使用 neo4j gem 的 8.1.x,您应该可以做到 MATCH (n) DETACH DELETE n。以前,如果您删除整个数据库,gem 会抱怨迁移需要 运行,因为 SchemaMigration 节点会被删除。在 8.1 中,该检查现在被忽略了。在 8.1 之前,您需要执行以下操作:

MATCH (n) WHERE NOT n:`Neo4j::Migrations::SchemaMigration` DETACH DELETE n

另外,在 8.1 中你可能不想做 rake neo4j:migrate 而是做 rake neo4j:schema:load 加载所有的约束/索引而不是 运行ning 通过每次迁移,随着您进行更多迁移,它会变得越来越慢。但是,要使 neo4j:schema:load 正常工作,您需要确保 db/neo4j/schema.yml 文件已签入您的存储库(每次您 运行 rake neo4j:migrate 时都会重新生成该文件)以便它与您的迁移同步)

我也更喜欢将我的 DELETE 语句放在 before(:each) 而不是 after(:each) 中,这样我可以确定我的测试是 运行状态。否则,一个 不会 清理的损坏测试文件本身会弄乱另一个测试文件,并且通常不清楚发生这种情况时发生了什么。