1

在学习 Michael Hartl 的 Rails 教程时,我在测试部分尝试了一些自定义函数,但遇到了令我惊讶的限制。基本上,全局路径变量(例如“root_path”)仅在 RSpec 测试的“描述”块中的“it”部分的“do...end”块中起作用。

我相信以下细节可以归结为一个问题,“it”块有什么特别之处,它使“root_path”能够在那里工作,而不能在“it”块之外工作?

(我已经确定了一个解决方法,但我很好奇这种行为是否有可靠的解释。)

文件: spec/requests/static_pages_spec.rb

这失败了:

require 'spec_helper'

def check_stable(path)
  it "should be stable" do
    get path
    response.status.should be(200)
  end
end

describe "StaticPages" do
  describe "Home => GET" do
    check_stable(root_path)
  end
end

这成功了:

require 'spec_helper'

describe "StaticPages" do
  describe "Home => GET" do
    it "should be stable" do
      get root_path
      response.status.should be(200)
    end
  end
end

失败基本上是:

$ bundle exec rspec spec/requests/static_pages_spec.rb
Exception encountered: #<NameError: undefined local variable or method `root_path' for #<Class:0x00000004cecd78>>

...知道为什么吗?

我尝试了关于这两个线程的所有建议:

Hartl 教程第 5.3.2 节:Rails 路由

Rspec 和命名路由

在我解决上述问题之前,没有任何工作。

4

2 回答 2

2

是的,命名路线仅在itspecify块内有效。但是修改代码很容易:

def should_be_stable(path)
  get path
  response.status.should be(200)
end

describe "StaticPages" do
  describe "Home => GET" do
    it { should_be_stable(root_path) }
  end
end

你钢铁需要包括 url_helpers

于 2013-02-16T07:22:40.827 回答
1

it块(或specify块)表示实际测试。在测试中,您将可以访问完整的 Rails 和 Rspec 助手;在测试之外,不是那么多(正如你已经制定的那样)。

于 2013-02-16T07:25:04.367 回答