Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby RSpec中的相对文件路径_Ruby_Rspec - Fatal编程技术网

Ruby RSpec中的相对文件路径

Ruby RSpec中的相对文件路径,ruby,rspec,Ruby,Rspec,我对/lib/classes中的一个类进行了RSpec测试,该类需要访问zip文件(无需上传)。该文件存储在/spec/fixtures/files/test.zip中。如何输入正确的路径,使其与环境无关,即没有绝对路径?据我所知(每一两个月查看一次),在spec\u helper中构建使用\u FILE\uuuu值获取已知内容路径的内容,没有更好的方法,然后在此基础上构建自己的助手 显然,您也可以在单个*\u spec.rb文件中使用相对于\uuuuuuuuuuuuuuuuuuuuuuuuuu

我对
/lib/classes
中的一个类进行了RSpec测试,该类需要访问zip文件(无需上传)。该文件存储在
/spec/fixtures/files/test.zip
中。如何输入正确的路径,使其与环境无关,即没有绝对路径?

据我所知(每一两个月查看一次),在
spec\u helper
中构建使用
\u FILE\uuuu
值获取已知内容路径的内容,没有更好的方法,然后在此基础上构建自己的助手


显然,您也可以在单个
*\u spec.rb
文件中使用相对于
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu文件的路径。

Rails.root
Rails.root.join "spec/fixtures/files/test.zip"

将为您提供文件的绝对路径,不知道应用程序在硬盘上的位置。

我最近解决了这个问题,下面是我的想法:

spec\u helper.rb
(或等效文件)中定义一个指向RSpec根的常量:

RSPEC_ROOT = File.dirname __FILE__
*\u spec.rb
(或等效)测试文件中使用此变量:

require 'spec_helper'

File.open("#{RSPEC_ROOT}/resources/example_data.json")
为什么要采用这种解决方案

  • 它没有利用测试文件的位置,而测试文件可能是 可能会发生变化(规格帮助器可能不会)
  • 除了已经存在的测试文件之外,它不需要向测试文件添加任何内容
    需要“spec\u helper”
  • 它不依赖于Rails(不同于
    Rails.root

这里有一个要点:

对于其他有相同问题的人:因为我的规范位于/spec/类中,所以我最终得到了:
File.dirname(\uuu文件)+'/../fixtures/files/test.zip'
这很好用,但如果重新排列规范,它可能会有点脆弱。当然,我们不能假设您使用Rails,但如果您可以访问项目根目录(Rails.root,Sinatra::Application.root),这可能是一个更稳定的替代方案,也可能不是。要跨平台工作,请不要在字符串中嵌入“/”,而是使用:File.join(File.dirname(File),“…”,“fixtures”,“files”,“test.zip”)Ruby还具有require_relative(在1.9.2中引入),另外还有一个gem,它可以将Ruby向后移植到1.8。使用rspec rails,您可以更轻松地访问设备,如下所述: