Ruby,使用spec帮助文件调用“require_relative”

时间:2015-04-01 23:21:19

标签: ruby require

我对此目录结构有一系列玩具问题:

  • LIB
    • 001-problem.rb
    • 002-another_problem.rb
    • 003-more_problems.rb
    • 等...
  • 规格
    • 001-problem_spec.rb
    • 002-another_problem_spec.rb
    • 003-more_problems_spec.rb
    • 等...

规范文件& lib文件被命名为相互匹配。

在规范文件中,让我们说它来自001-problem_spec.rb,我可以照常做到:require_relative '../lib/001-problem_spec.rb'

但是,由于我打算创建数十个文件,这有点老了。我想制作一个模板。所以我在每个文件的顶部尝试了这个:

spec_file_basename = File.basename(__FILE__)
cut_here = spec_file_basename.index('_spec')
lib_file_basename = spec_file_basename[0...cut_here]
file = "../lib/#{lib_file_basename}.rb"
require_relative file

但这是相当长的&重复。我想将类似此代码块的内容放入spec_helper文件中,以便我的每个规范文件都能像这样引用它:
require 'spec_helper'。显然,只需将之前的代码块粘贴到spec_helper文件中就不会起作用,因为__FILE__将返回我的帮助程序文件的名称(即:spec_helper.rb),而不是我的规范文件(即:001-problem_spec.rb)。

有没有办法获取调用require 'spec_helper'的文件的名称,然后在我的spec_helper文件中使用该文件名,以便spec_helper可以要求spec文件的正确lib文件?

1 个答案:

答案 0 :(得分:0)

我通过创建自己的目录结构解决了问题。 您可以遵循相同的规则,这可能会对您有所帮助。

1)problem/spec/t_spec.rb

require './spec_helper'

2)problem/spec_helper.rb

require './t_file_helper'
spec_file_basename = TFile.basename.split('/').last
puts "===spec_file_basename===#{spec_file_basename}====="

3)problem/t_file_helper.rb

class TFile 
  def self.basename
    eval('$0')
  end
end  

执行ruby spec/t_spec.rb

  • 输出:===spec_file_basename===t_spec.rb=====

现在,您可以在spec_helper.rb中执行相同的代码。因为现在我们有spec_file_basename