如何在Rails应用程序中的嵌套目录结构中指定文件位置?

时间:2014-05-06 17:42:49

标签: ruby-on-rails ruby file

假设您有一个具有以下目录结构的Rails 4应用程序:

my_app
my_app/spec
my_app/spec/models/foo_spec.rb
my_app/spec/support/utilities.rb
my_app/spec/test_files/bar.txt

我在my_app/spec/support/utilities.rb文件中有一个函数,它从my_app/spec/test_files/bar.txt读取数据,在测试模型之前用一些记录填充测试数据库。

my_app/spec/support/utilities.rb包含

this_path = File.expand_path(File.dirname(__FILE__))
fname = File.join(this_path, '../test_files/bar.txt')

File.open(fname, 'r').each_line do |line|
  # create entries in Foo from tab delimited data
end

这适用于打开my_app/spec/test_files/bar.txt,但我想知道是否有更好的方法来指定我要打开的文件所在的位置。

1 个答案:

答案 0 :(得分:1)

关于阅读文件,请参阅此问题:"require File.dirname(__FILE__)" -- how to safely undo filesystem dependency?

然而,看到你的用例我有一些建议可能会让事情变得更容易。

如果在测试模型之前使用记录填充测试数据库,则可以使用Fixtures而不是原始文本数据更轻松地完成此操作。我建议看一下Ruby on Rails中的Fixtures。利用夹具(以下http://guides.rubyonrails.org/testing.html中的示例)将允许您在运行测试之前加载特定数据。您还可以在测试之前使用FactoryGirl和序列来生成数据。我在下面有各自的例子。

# in spec/spec_helper.rb or spec/<model_spec> using FactoryGirl
before(:each) do
  (0..100).each do { |n| create(:user, id: 1 + n) }
end

# in spec/spec_helper.rb
before(:all) do
  fixtures :users
end

# in spec/fixtures/users.yml
david:
  name: David Heinemeier Hansson
  birthday: 1979-10-15
  profession: Systems development

steve:
  name: Steve Ross Kellock
  birthday: 1974-09-27
  profession: guy with keyboard