学习Ruby,我的Ruby app目录结构遵循惯例 使用lib /和test /
在我的根目录中我有一个身份验证配置文件,我从lib /中的一个类中读取。它被读作File.open('../ myconf')。
使用Rake进行测试时,打开的文件不起作用,因为工作目录是根目录,而不是lib /或test /。
为了解决这个问题,我有两个问题: 是否有可能,我应该指定rake工作目录来测试/? 我应该使用不同的文件发现方法吗?虽然我更喜欢约定优于配置。
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
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
答案 0 :(得分: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
- &gt; open_file
,因为这与ruby编码约定更加一致。
答案 1 :(得分: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