ruby - 在 RSpec Rake 任务与 rspec runner 中引用文件位置

标签 ruby rspec2

我有这样的目录结构:

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文件是否仅用于测试,您可以将其放在任何地方吗?

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

  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 参数中。

关于ruby - 在 RSpec Rake 任务与 rspec runner 中引用文件位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147846/

相关文章:

ruby-on-rails - RSPEC NoMethodError : helper method calling another controller's action -

rspec - 在RSpec中,之前(:suite) and before(:all)?

ruby-on-rails - 在功能场景中使用 VCR 和 Rspec

ruby-on-rails - 普通项目上的 RSpec MustBeConfiguredBeforeExampleGroupsError

ruby - Rails 控制台无法在服务器上运行

ruby-on-rails - Rails Controller 中未初始化的常量错误

javascript - Rails 相当于 setInterval?

ruby-on-rails - 没有路由匹配 [GET] "/recipes/1/like"我想要一个 POST 请求

testing - RSpec 和测试 Rails Gem

ruby-on-rails - 命名路由作为参数,例如 rspec 中的组