ruby-on-rails – (显然)两个rake任务的相同测试;只有一个通过
我正在尝试在rspec中为两个rake任务编写测试,这两个rake任务在同一个文件中定义(在Rails 3.0.11项目中).出于某种原因,只有其中一个通过.我写了一个小的演示来抽象出任务的实际内容,同样的事情发生了.从命令行使用rake调用时,这两个任务都有效.这是怎么回事?这是我的演示:
LIB /任务/ demo_tasks.rake namespace :demo do task :test => :environment do puts "test!" end task :test_two => :environment do puts "second test!" end end 规格/ lib目录/任务/ demo_spec.rb require 'spec_helper' require 'rake' describe "test tasks" do let(:rake) do app = Rake::Application.new app.options.silent = true app end before :each do Rake.application = rake Rake.application.rake_require 'lib/tasks/demo_tasks',[Rails.root.to_s] Rake::Task.define_task :environment end describe "demo:test" do it "runs" do rake["demo:test"].invoke end end describe "demo:test_two" do it "also_runs" do rake["demo:test_two"].invoke end end end rspec spec / lib / tasks / demo_spec.rb test tasks demo:test test! runs demo:test_two also_runs (FAILED - 1) Failures: 1) test tasks demo:test_two also_runs Failure/Error: rake["demo:test_two"].invoke RuntimeError: Don't know how to build task 'demo:test_two' # ./spec/lib/tasks/demo_spec.rb:26:in `block (3 levels) in <top (required)>' 解决方法
Nutshell:将之前的内容更改为之前:all(而不是:each).
或者:将空数组作为第三个参数传递给rake_require. Rake.application.rake_require 'lib/tasks/demo_tasks',[Rails.root.to_s],[] 细节 def rake_require(file_name,paths=$LOAD_PATH,loaded=$") ? fn = file_name + ".rake" ? return false if loaded.include?(fn) ... $“是一个Ruby特殊变量,它包含由require加载的模块数组. 如果你没有传递可选参数,rake_require将使用Ruby加载的那个模块数组.这意味着模块不会再次加载:Ruby知道模块已加载,rake检查以查看Ruby知道的内容,并且它是每个测试的新rake实例. 切换到之前:全部工作,因为它意味着let块只运行一次:一个rake实例,一个模块加载,每个人都很高兴. 所有这些都说,为什么要重新加载耙环境两次呢?您的目标是测试您的任务,这不需要为每个规范提供新的rake上下文. 您可以在每个规范中以一些轻微的冗长为代价完全消除本地: describe "test tasks" do before :all do Rake.application = Rake::Application.new Rake.application.rake_require 'lib/tasks/demo_tasks',[Rails.root.to_s] Rake::Task.define_task :environment end describe "demo:test" do it "runs" do Rake::Task["demo:test"].invoke end end end 您可以在before块中定义一个实例变量,以避免Rake :: Task引用: before :all do @rake = Rake::Application.new Rake.application = @rake Rake.application.rake_require 'lib/tasks/demo_tasks',[Rails.root.to_s] Rake::Task.define_task :environment end describe "demo:test" do it "runs" do @rake["demo:test"].invoke IMO,由于多种原因而不太理想. Here’s a summary I agree with. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |