2

我最近将一个模块提取到一个Rails::Engine包含用于运行测试的“虚拟应用程序”的 gem 中。 rake spec现在行为不同,并导致某些规范失败。

首先,rake spec --trace在 gem 目录中运行不再导致这个长调用链:

** Invoke spec (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment 
** Invoke db:load_config 
** Execute db:test:purge
** Execute db:test:load
** Invoke db:test:load_schema (first_time)
** Invoke db:test:purge 
** Execute db:test:load_schema
** Invoke db:schema:load (first_time)
** Invoke environment 
** Invoke db:load_config 
** Execute db:schema:load
** Execute test:prepare
** Execute spec

而只是调用:

** Invoke spec (first_time)
** Execute spec

我在 RSpec::Core::RakeTask 中没有看到任何执行 DB 初始化的代码,所以这必须是 Rails 根目录中的 Rakefile 添加的 Rails 函数。

我考虑通过添加以下内容来解决这个问题:

task :my_spec do
  ENV['RAILS_ENV'] = 'test'
  Rake::Task['db:drop'].invoke
  Rake::Task['db:create'].invoke
  ENV['SCHEMA'] = '/Users/me/sandbox/my_app/db/schema.rb'
  Rake::Task['db:schema:load'].invoke
  Rake::Task['spec'].invoke
end

但是这些任务都不是由 gem 根目录中的 Rakefile 加载的。

如何rake spec从此目录初始化测试数据库?

其次,rspec 不再在测试之间清除数据库,因此依赖原始数据库状态的测试现在失败了。也许这意味着我写错了我的测试,但我认为测试的“空白”想法在理解测试输出时是一个有用的想法。

如何rake spec在测试之间清除数据库,就像对普通 Rails 应用程序一样?

4

0 回答 0