我在Rakefile中有一系列rake任务,我想测试它作为我的规范的一部分等。每个任务都以以下形式定义:
task :do_somthing => :environment do
# Do something with the database here
end
其中:environment任务设置ActiveRecord / DataMapper数据库连接和类。我不是将它作为Rails的一部分使用,但我有一系列测试,我喜欢将它作为BDD的一部分运行。
此片段说明了我是如何尝试测试rake任务的。
def setup
@rake = Rake::Application.new
Rake.application = @rake
load File.dirname(__FILE__) + '/../../tasks/do_something.rake'
end
should "import data" do
@rake["do_something"].invoke
assert something_in_the_database
end
所以我的帮助请求 - 是否有可能在我的test_helper.rb文件中覆盖:environment任务,所以我的rake测试与我的测试数据库交互,而不是生产?我已经尝试在帮助文件中重新定义任务,但这不起作用。
对解决方案的任何帮助都会很棒,因为过去一周我一直坚持这一点。
答案 0 :(得分:9)
我对类似问题的“解决方案”是从我的.rake文件中提取所有逻辑并创建类来执行任务,只在rake文件中留下一行调用,我对未测试也感到自信硬。然后可以非常正常地测试这些类。
我不知道这对于一系列相互依赖的复杂任务是如何做得很好的,这些任务维持着一些影响深远的状态:可能不太好,但是再一次很可能是其他一些设计问题的表现。
我很想知道我是否错过了更好的东西。
编辑:曾经有一篇博文here,(a)说同样的话,(b)说得更好。看起来他也是第一个说的。答案 1 :(得分:1)
我认为你正在寻找这条线: require(File.join(RAILS_ROOT,'config','environment')) 这正是您在“任务:环境”实施中找到的内容
我用它来测试我的rake任务使用rspec
答案 2 :(得分:0)
当你运行测试环境时,正在加载的是测试。
所以你正在与测试进行交互 仅限数据库。
所以我没有看到任何理由在test_helper.rb中覆盖你的rake任务