我有这样的目录结构:
project_dir
spec
person
person_invalid_address_examples.yaml
person_spec.rb
rakefile.rb
person_spec.rb 中有这段代码:
describe "Create person tests"
...
context "Person with invalid address" do
invalid_address_examples = []
File.open("person_invalid_address_examples.yaml", "r") do |file|
invalid_address_examples = YAML::load(file)
end
invalid_address_examples.each do |example|
it "Does not allow to create person with #{example[:description]}" do
person.address = example[:value]
result = person.create
result.should_not be_success
end
end
end
...
end
现在,当我从人员目录 rspec person_spec.rb
运行时,一切都按预期进行。但是,如果我从 rakefile 运行 RSpec rake 任务,我会得到 No such file or directory
错误......问题显然也存在于相反的方向 - 如果我使用相对于 rakefile 位置的路径配置文件名然后 RSpec rake 任务工作正常但我从 rspec runner 得到 No such file or directory
错误..有没有办法用路径配置文件名,以便它适用于 RSpec rake 任务和 Rspec runner同时?
最佳答案
File.open
是否工作取决于加载路径——ruby 在当前加载路径的目录中查找该相对路径。您可以在特殊的 $:
变量中查看加载路径。
尝试查看此变量的值,比较两种执行规范的方法,看看它有何不同/是否不同。
可能是当前工作目录(基本上,您从哪个目录执行命令,在路径列表中显示为 .
)在加载路径上,并且当前工作目录在您运行规范的两种不同方法中最终会有所不同。
您的 yaml 文件位于何处?您的YAML文件是否仅用于测试,您可以将其放在任何地方吗?
您有多种选择,但它们都取决于提供绝对路径或始终位于加载路径上的相对路径。
将 yml 文件移动到始终位于加载路径上的某个位置。您的
spec
目录可能已经在加载路径上。您可以将您的 yml 放在./spec/example.yml
中。或者将您的 yml 放在子目录中,但在open
中也引用该子目录 --spec/support/data/examples.yml
,然后open "data/examples.yml"
(从加载路径上的目录开始,data/examples.yml
将解析)。或者,忽略加载路径,您可以使用特殊的
__FILE__
变量来构建您的 yml 文件的完整路径,从它的相对位置到当前文件。__FILE__
是引用它的代码所在的源文件的文件路径。或者,可能比 2 更好,您可以添加示例数据目录到您的
spec_helper.rb
中的加载路径,方法是构建一个路径__FILE__
,然后将其添加到$:
变量中。例如,example_data
目录。
不过,#1 可能足以满足您的需求。将 yml 放在您的 spec
目录中——或者将它放在您的 spec
目录的子目录中,但将该子目录包含在 open
参数中。
关于ruby - 在 RSpec Rake 任务与 rspec runner 中引用文件位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147846/