1

我有这个目录结构:

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

现在,当我从 person 目录运行时,rspec person_spec.rb一切都按预期工作。但是,如果我从 rakefile 运行 RSpec rake 任务,我会收到No such file or directory错误...问题显然也反过来存在 - 如果我使用相对于 rakefile 位置的路径配置文件名,则 RSpec rake 任务工作正常,但我No such file or directory从rspec runner .. 有没有办法用路径配置文件名,以便它同时适用于 RSpec rake 任务和 Rspec runner?

4

2 回答 2

2

您的File.open作品是否取决于加载路径——ruby 在当前加载路径的目录中查找该相对路径。您可以查看特殊$:变量中的加载路径。

尝试查看在执行规范的两种方法之间比较的这个变量的值,看看它如何/是否不同。

可能是当前工作目录(基本上,您从哪个目录执行命令,显示在路径列表中.)在加载路径上,并且当前工作目录在您运行的两种不同方法中最终不同规格。

你的 yaml 文件在哪里?您的 YAML 文件是否仅用于测试,您可以将它放在任何您想要的地方吗?

您有多种选择,但它们都依赖于提供绝对路径或始终位于加载路径上的相对路径。

  1. 将 yml 文件移动到始终位于加载路径上的某个位置。您的spec目录可能已经在加载路径上。您可以将 yml 放入./spec/example.yml. 或者将您的 yml 放在子目录中,但在open--中引用该子目录spec/support/data/examples.yml,然后open "data/examples.yml"(从加载路径上的目录开始,data/examples.yml将解析)。

  2. 或者,忽略加载路径,您可以使用特殊__FILE__变量来构建 yml 文件的完整路径,从它到当前文件的相对位置。__FILE__是引用它的代码所在的源文件的文件路径。

  3. 或者,可能比 2 更好,您可以示例数据目录添加到您的加载路径中spec_helper.rb,方法是使用 构建路径__FILE__,然后将其添加到$:变量中。例如,一个example_data目录。

不过,#1 可能足以满足您的需求。将 yml 放在您的spec目录中 - 或将其放在目录的spec子目录中,但在open参数中包含该子目录。

于 2013-04-22T13:24:00.753 回答
1

这是因为

File.open("person_invalid_address_examples.yaml", "r")

它会打开运行 rspec 的文件。在您的情况下,您应该更明显地定义文件,如下所示:

file_path = File.expand_path("person_invalid_address_examples.yaml", File.dirname(__FILE__))
File.open(file_path, "r")
于 2013-04-22T13:17:14.720 回答