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,您可以更轻松地访问设备,如下所述: