我正在构建一个集成测试套件,并且有一部分逻辑需要一个干净的数据库。如何在我的一个测试中运行db:test:purge
任务?
我使用的是:ruby 1.9.2,rails 3.0.9,rspec 2.6
我正在构建一个集成测试套件,并且有一部分逻辑需要一个干净的数据库。如何在我的一个测试中运行db:test:purge
任务?
我使用的是:ruby 1.9.2,rails 3.0.9,rspec 2.6
您可以按照以下方式调用Rake任务:
require 'rake'
Rake::Task[name].invoke
require 'rake'
Rake::Task['db:test:purge'].invoke
:environment
),因为在使用此方法调用任务时不会运行它们。 - xentekMyRailsApp::Application.load_tasks
来加载任务是必要的。 - Erdem GezerMyRailsApp::Application.load_tasks
会导致测试污染问题,在测试套件中如果之前已经调用过load_tasks
,则我的Rake任务将被多次调用。使用Rake.application.rake_require
和Rake::Task.define_task(:environment)
可以避免这个问题。 - yuvalinvoke
仅会在每次load_tasks
中运行一次任务。如果需要多次运行,请使用execute
。 - B Seven经过我尝试,原先被批准的答案并不能满足我的需求,因为我需要执行自己编写的rake任务。
以下是我的解决方案:
将其放置在spec文件的顶部
require 'rake'
将以下代码放置在需要执行自定义rake任务的位置,例如从文件example.rake运行rake update_data
load File.expand_path("../../../lib/tasks/example.rake", __FILE__)
# make sure you set correct relative path
Rake::Task.define_task(:environment)
Rake::Task["update_data"].invoke
我的环境:
rails (4.0.0)
ruby (2.0.0p195)
rspec-core (2.14.7)
rspec-expectations (2.14.3)
rspec-mocks (2.14.4)
rspec (2.14.1)
rspec-rails (2.14.0)
Rake::Task.define_task(:environment)
for the win in avoiding RuntimeError: Don't know how to build task 'environment' (see --tasks)
- s2t2Rake.application.rake_require "tasks/task-name"
来加载特定的任务进行测试,而不是使用Rails.application.load_tasks
加载所有任务(Rails 5,Rspec 3.5)。 - Steverequire "rake"
Rails.application.load_tasks
然后只需调用任何任务。
Rake::Task['sync:process_companies'].invoke
虽然我不能确认它是否更慢,因为它加载了所有的任务。
Rails.application.load_tasks
会导致测试污染问题,如果在同一套件中之前已经调用了load_tasks
,则我的Rake任务将被多次调用。使用上述解决方案可以避免这个问题。 - yuval对于我来说(Rails 6)
Rails.application.load_tasks
Rake::Task['app:sync'].invoke
=> 我的情况下不需要require
Rake::Task.clear
,因为(出于某种原因)如果已将任务注册为already_invoked
(即如果Rake::Task ['my_task'].already_invoked
返回true
),则任务不会再次运行。after { Rake::Task.clear }
当运行同一个rake任务的多个测试时,一切都按预期工作。
Rake::Task#reenable
。 - akostadinovrequire 'rake'
Rake.application.rake_require 'tasks/new_adapter'
接下来,只需调用该任务即可
Rake::Task['new:adapter'].invoke