RSpec中的相对文件路径

win*_*ons 8 ruby rspec

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

Eva*_*wry 14

Rails.root 会给你应用程序root,所以

Rails.root.join "spec/fixtures/files/test.zip"
Run Code Online (Sandbox Code Playgroud)

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


thi*_*ign 9

我最近解决了这个问题,这是我想出的:

在您的spec_helper.rb(或等效的)中定义一个指向 RSpec 根的常量:

RSPEC_ROOT = File.dirname __FILE__
Run Code Online (Sandbox Code Playgroud)

在您的*_spec.rb(或等效的)测试文件中使用此变量:

require 'spec_helper'

File.open("#{RSPEC_ROOT}/resources/example_data.json")
Run Code Online (Sandbox Code Playgroud)

为什么是这个解决方案?

  • 它不使用可能会更改的测试文件的位置(spec_helper 可能不会)
  • 除了已经存在的测试文件之外,它不需要任何添加 require 'spec_helper'
  • 它不依赖于 Rails(不像Rails.root

这是一个要点:https : //gist.github.com/thisismydesign/9dc142f89b82a07e413a45a5d2983b07


Dan*_*man 5

据我所知(从一两个月的时间来看),没有更好的方法来构建spec_helper使用该__FILE__值的东西来抢占已知内容的路径,然后在此之上构建自己的助手。

您显然也可以__FILE__在单个*_spec.rb文件中使用相对于的路径。

  • 要使其跨平台工作,请勿在字符串中嵌入“/”,而是使用:File.join(File.dirname(__FILE__), '..', 'fixtures', 'files', 'test.zip' ) (2认同)