ruby – 如何使用RSpec模拟存根文件目录及其内容?

ruby – 如何使用RSpec模拟存根文件目录及其内容?,第1张

概述不久之前我问了“ How to test obtaining a list of files within a directory using RSpec?”,虽然我得到了几个有用的答案,但我仍然卡住了,因此这是一个新的问题,更详细地介绍了我正在尝试做的事情. 我正在写我的第一个RubyGem.它有一个模块,其中包含一个类方法,该方法返回一个数组,该数组包含指定目录中的非隐藏文件列表.像这样: f 不久之前我问了“ How to test obtaining a list of files within a directory using 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,但作为我的另一个问题的答案之一说,我不需要测试库.

我真的不知道如何编写这些规格,所以任何帮助都非常感谢!

编辑:下面的缓存方法是我试图测试的方法:

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
解决方法 我将假设您有一些方法可以获取所有文件,然后计算哈希值.让我们调用该方法get_file_hash并将其定义如下.

def get_file_hash  file_hash = {}  Find.find(Dir.pwd) do |file|     file_hash[file] = compute_hash(file.read(file))  end  file_hashend

正如我之前回答的那样,我们将继续存根Find.find和file.read.但是,我们不会存在compute_hash方法,因为您要检查文件哈希.我们将让compute_hash方法创建文件内容的实际哈希值.

describe "#get_file_hashes"  ......  before(:each)    file.stubs(:find).returns(['file1','file2'])    file.stubs(:read).with('file1').returns('some content')    file.stubs(:read).with('file2').returns('other content')  end  it "should return the hash for all files"@whatever_object.get_file_hashes.should eql({'file1' => "hash you are expecting for 'some content'",'file2' => "hash you are expecting for 'other content'"})endend

为简单起见,我只是读取文件正文并将其传递给compute_hash方法并生成哈希.但是,如果您的compute_hash方法在文件上使用其他一些方法以及生成哈希.然后你可以将它们存根并返回一个值以传递给compute_hash方法.虽然,如果它是一个公共方法,并且只是在get_file_hash方法中存根调用,我会更倾向于单独测试compute_hash方法.

关于不显示隐藏文件;你将使用一个库来省略私人文件或将有自己的方法来做到这一点.在前一种情况下,您不需要编写任何测试(假设库已经过充分测试),对于后一种情况,您需要测试该单独的方法而不是这个.

用于测试内容更改时重新计算文件的哈希值;我想你必须有一些触发重新计算哈希的事件.只需调用该事件方法并断言文件哈希匹配即可.

总结

以上是内存溢出为你收集整理的ruby – 如何使用RSpec模拟/存根文件目录及其内容?全部内容,希望文章能够帮你解决ruby – 如何使用RSpec模拟/存根文件目录及其内容?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1288196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存