1

学习 Ruby,我的 Ruby 应用目录结构遵循 lib/ 和 test/ 的约定

在我的根目录中,我有一个身份验证配置文件,我从 lib/ 中的一个类中读取该文件。它读作 File.open('../myconf')。

使用 Rake 进行测试时,打开的文件不起作用,因为工作目录是根目录,而不是 lib/ 或 test/。

为了解决这个问题,我有两个问题:有可能吗,我应该将 rake 工作目录指定为 test/ 吗?我应该使用不同的文件发现方法吗?虽然我更喜欢约定而不是配置。

库/A.rb

class A 
def openFile
    if File.exists?('../auth.conf')
        f = File.open('../auth.conf','r')
...

    else
        at_exit { puts "Missing auth.conf file" }
        exit
    end
end

测试/testopenfile.rb

require_relative '../lib/A'
require 'test/unit'

class TestSetup < Test::Unit::TestCase

    def test_credentials

        a = A.new
        a.openFile #error
        ...
    end
end

尝试使用 Rake 调用。我确实设置了一个任务来将 auth.conf 复制到测试目录,但结果发现工作目录在 test/ 之上。

> rake
cp auth.conf test/
/.../.rvm/rubies/ruby-1.9.3-p448/bin/ruby test/testsetup.rb
Missing auth.conf file

耙文件

task :default => [:copyauth,:test]

desc "Copy auth.conf to test dir"
        task :copyauth do
                sh "cp auth.conf test/"
        end

desc "Test"
        task :test do
                ruby "test/testsetup.rb"
        end
4

2 回答 2

1

您可能会收到该错误,因为您是rake从项目根目录运行的,这意味着当前工作目录将设置为该目录。这可能意味着调用File.open("../auth.conf")将开始从您当前的工作目录开始查找一个目录。

尝试指定配置文件的绝对路径,例如:

class A 
  def open_file
    path = File.join(File.dirname(__FILE__), "..", "auth.conf")
    if File.exists?(path)
      f = File.open(path,'r')
      # do stuff...
    else 
      at_exit { puts "Missing auth.conf file" }
    exit
  end
end

顺便说一句,我冒昧地更改了openFile-> open_file,因为这更符合 ruby​​ 编码约定。

于 2013-07-18T08:31:46.790 回答
1

我建议为此使用File.expand_path方法。auth.conf您可以根据__FILE__(当前文件 -lib/a.rb在您的情况下)或Rails.root根据您的需要评估文件位置。

def open_file
  filename = File.expand_path("../auth.conf", __FILE__) # => 'lib/auth.conf'

  if File.exists?(filename)
    f = File.open(filename,'r')
    ...
  else
    at_exit { puts "Missing auth.conf file" }
    exit
  end
end
于 2013-07-18T09:50:19.530 回答