加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – (显然)两个rake任务的相同测试;只有一个通过

发布时间:2020-12-17 03:22:14 所属栏目:百科 来源:网络整理
导读:我正在尝试在rspec中为两个rake任务编写测试,这两个rake任务在同一个文件中定义(在Rails 3.0.11项目中).出于某种原因,只有其中一个通过.我写了一个小的演示来抽象出任务的实际内容,同样的事情发生了.从命令行使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读