配置位置ruby并使用rake进行单元测试

时间:2013-07-17 08:48:27

标签: ruby rake

学习Ruby,我的Ruby app目录结构遵循惯例 使用lib /和test /

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

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

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

LIB / 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

Rake文件

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

2 个答案:

答案 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