Обновление: gem install files
, затем
require "files"
dir = Files do
file "hello.txt", "stuff"
end
Дополнительные примеры приведены ниже.
Вот еще одно решение, основанное на нескольких других ответах.Этот подходит для включения в тест (например, rspec или spec_helper.rb).Он создает временный каталог на основе имени включающего файла, сохраняет его в переменной экземпляра, чтобы он сохранялся в течение всего теста (но не распределяется между тестами), и удаляет его при выходе (или, по желанию, нет,если вы хотите проверить его содержимое после запуска теста).
def temp_dir options = {:remove => true}
@temp_dir ||= begin
require 'tmpdir'
require 'fileutils'
called_from = File.basename caller.first.split(':').first, ".rb"
path = File.join(Dir::tmpdir, "#{called_from}_#{Time.now.to_i}_#{rand(1000)}")
Dir.mkdir(path)
at_exit {FileUtils.rm_rf(path) if File.exists?(path)} if options[:remove]
File.new path
end
end
(Вы также можете использовать Dir.mktmpdir (который существует начиная с Ruby 1.8.7) вместо Dir.mkdir , но я нахожу API этого метода запутанным, не говоря уже об алгоритме именования.)
Пример использования (и другой полезный метод тестирования):
def write name, contents = "contents of #{name}"
path = "#{temp_dir}/#{name}"
File.open(path, "w") do |f|
f.write contents
end
File.new path
end
describe "#write" do
before do
@hello = write "hello.txt"
@goodbye = write "goodbye.txt", "farewell"
end
it "uses temp_dir" do
File.dirname(@hello).should == temp_dir
File.dirname(@goodbye).should == temp_dir
end
it "writes a default value" do
File.read(@hello).should == "contents of hello.txt"
end
it "writes a given value" do
# since write returns a File instance, we can call read on it
@goodbye.read.should == "farewell"
end
end
Обновление: я использовал этот код для запуска драгоценного камня, который я называю files
, который призван упростить создание каталогов и файлов для временного (например, модульного тестирования) использования.См. https://github.com/alexch/files и https://rubygems.org/gems/files.Например:
require "files"
files = Files do # creates a temporary directory inside Dir.tmpdir
file "hello.txt" # creates file "hello.txt" containing "contents of hello.txt"
dir "web" do # creates directory "web"
file "snippet.html", # creates file "web/snippet.html"...
"<h1>Fix this!</h1>" # ...containing "<h1>Fix this!</h1>"
dir "img" do # creates directory "web/img"
file File.new("data/hello.png") # containing a copy of hello.png
file "hi.png", File.new("data/hello.png") # and a copy of hello.png named hi.png
end
end
end # returns a string with the path to the directory