Некоторое время назад я спросил " Как проверить получение списка файлов в каталоге с использованием RSpec? ", и хотя я получил пару полезных ответов, я все еще застрял, отсюда и новый вопрос с некоторыми подробностями о том, что я пытаюсь сделать.
Я пишу свой первый RubyGem. Он имеет модуль, который содержит метод класса, который возвращает массив, содержащий список не скрытых файлов в указанном каталоге. Как это:
files = Foo.bar :directory => './public'
Массив также содержит элемент, который представляет метаданные о файлах. На самом деле это хэш хэшей, сгенерированный из содержимого файлов, идея состоит в том, что изменение даже одного файла меняет хеш.
Я написал свои ожидающие примеры RSpec, но я действительно не знаю, как их реализовать:
it "should compute a hash of the files within the specified directory"
it "shouldn't include hidden files or directories within the specified directory"
it "should compute a different hash if the content of a file changes"
Я действительно не хочу, чтобы тесты зависели от реальных файлов, выступающих в качестве фиксаторов. Как я могу издеваться или заглушать файлы и их содержимое ? В реализации gem будет использоваться Find.find
, но, как сказал один из ответов на другой мой вопрос, мне не нужно тестировать библиотеку.
Я действительно не знаю, как написать эти спецификации, поэтому любая помощь очень ценится!
Редактировать : метод cache
ниже - это метод, который я пытаюсь проверить:
require 'digest/md5'
require 'find'
module Manifesto
def self.cache(options = {})
directory = options.fetch(:directory, './public')
compute_hash = options.fetch(:compute_hash, true)
manifest = []
hashes = ''
Find.find(directory) do |path|
# Only include real files (i.e. not directories, symlinks etc.)
# and non-hidden files in the manifest.
if File.file?(path) && File.basename(path)[0,1] != '.'
manifest << "#{normalize_path(directory, path)}\n"
hashes += compute_file_contents_hash(path) if compute_hash
end
end
# Hash the hashes of each file and output as a comment.
manifest << "# Hash: #{Digest::MD5.hexdigest(hashes)}\n" if compute_hash
manifest << "CACHE MANIFEST\n"
manifest.reverse
end
# Reads the file contents to calculate the MD5 hash, so that if a file is
# changed, the manifest is changed too.
def self.compute_file_contents_hash(path)
hash = ''
digest = Digest::MD5.new
File.open(path, 'r') do |file|
digest.update(file.read(8192)) until file.eof
hash += digest.hexdigest
end
hash
end
# Strips the directory from the start of path, so that each path is relative
# to directory. Add a leading forward slash if not present.
def self.normalize_path(directory, path)
normalized_path = path[directory.length,path.length]
normalized_path = '/' + normalized_path unless normalized_path[0,1] == '/'
normalized_path
end
end