未定义的方法`get'for#<rspec :: core :: examplegroup :: nested_1:0x00000106db51f8> </rspec :: core :: examplegroup :: nested_1:0x00000106db51f8>

时间:2011-06-09 16:36:28

标签: ruby-on-rails rspec

任何人都知道如何解决这个问题?在OSX上,尝试使用Rails 3.0.7运行RSpec。详情请见: https://gist.github.com/1017044

  it "renders buttons_widgets partial" do
    get :buttons_widgets
    response.should render_template("buttons_widgets")
  end


→ rspec tools_model_spec.rb
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/version.rb:4: warning: already initialized constant STRING
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/metadata.rb:48: warning: already initialized constant RESERVED_KEYS
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/pending.rb:6: warning: already initialized constant DEFAULT_MESSAGE
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/world.rb:6: warning: already initialized constant PROC_HEX_NUMBER
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/world.rb:7: warning: already initialized constant PROJECT_DIR
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/configuration.rb:43: warning: already initialized constant CONDITIONAL_FILTERS
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/configuration.rb:48: warning: already initialized constant DEFAULT_BACKTRACE_PATTERNS
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core/runner.rb:13: warning: already initialized constant AT_EXIT_HOOK_BACKTRACE_LINE
/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/bundler/gems/rspec-core-bea2366c817e/lib/rspec/core.rb:35: warning: already initialized constant SharedContext
Run filtered excluding {:if=>#<Proc:/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/gems/rspec-core-2.6.4/lib/rspec/core/configuration.rb:43>, :unless=>#<Proc:/Users/mm/.rvm/gems/ruby-1.9.2-p0@evergreen/gems/rspec-core-2.6.4/lib/rspec/core/configuration.rb:44>}
F

Failures:

  1) ToolsController renders buttons_widgets partial
     Failure/Error: get :buttons_widgets
     NoMethodError:
       undefined method `get' for #<RSpec::Core::ExampleGroup::Nested_1:0x00000106db51f8>
# ./tools_model_spec.rb:7:in `block (2 levels) in <top (required)>'

13 个答案:

答案 0 :(得分:133)

RSpec不知道您的规范是控制器规范,因此您的示例无法访问get方法。

RSpec 2.x假设controllers目录中的所有内容都是控制器规范。

这在RSpec 3中有所改变:

  

默认情况下禁用文件类型推断

     

以前我们会自动从文件位置推断出spec类型,对于新用户来说这是一个令人惊讶的行为,对于一些资深用户来说是不可取的,所以从RSpec 3开始,必须明确选择这种行为:

RSpec.configure do |config|
  config.infer_spec_type_from_file_location!
end

https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#file-type-inference-disabled

rspec-rails README

  

控制器规格默认驻留在spec/controllers folder中。使用元数据:type => :controller标记任何上下文都将其视为控制器规范。

为RSpec设置控制器上下文元数据的示例:

describe ToolsController, :type => :controller do
    # ...
end

答案 1 :(得分:25)

如果您使用的是“规格/功能”,则可能需要在“spec_helper.rb”中添加以下内容

config.include RSpec::Rails::RequestExampleGroup, type: :feature

答案 2 :(得分:24)

在Rspec 3.x中,不会从文件位置自动推断规格类型,您必须手动设置它,将其添加到spec_helper.rb

RSpec.configure do |config|
  config.infer_spec_type_from_file_location!
end

Rspec upgrade

答案 3 :(得分:14)

我可以通过将require 'rspec/rails'添加到我的spec_helper文件来修复此问题。

答案 4 :(得分:14)

对于其他人来说。我试图追踪undefined method 'get'错误。我的问题是getdescribe block get确保it block位于{{1}}。

答案 5 :(得分:5)

更换线路解决了 length describe PagesController do
在spec文件夹中的 _spec.rb 文件中。
另外为了防止弃用警告,请使用RSpec.describe PagesController, :type => :controller do代替expect(response).to be_success
PS:没有必要添加response should be_success

答案 6 :(得分:2)

我忘记将require 'spec_helper'添加到规范文件的顶部或--require spec_helper添加到我的.rspec文件时出现此错误。

答案 7 :(得分:1)

另一种方法是为您的规范指定type: :request。例如:

RSpec.describe "Widget management", :type => :request do

  it "creates a Widget and redirects to the Widget's page" do
    get "/widgets/new"
    expect(response).to render_template(:new)

    post "/widgets", :widget => {:name => "My Widget"}

    expect(response).to redirect_to(assigns(:widget))
    follow_redirect!

    expect(response).to render_template(:show)
    expect(response.body).to include("Widget was successfully created.")
  end

end

从这里取得的例子https://www.relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec

答案 8 :(得分:1)

如果您使用rspec来生成.rspec文件,则应更改以下内容:

--require spec_helper

收件人:

--require rails_helper

答案 9 :(得分:0)

我添加

时遇到了这个问题
gem 'rspec'

到rails项目中的Gemfile。它应该是

gem 'rspec'
gem 'rspec-rails'

(或只是rspec-rails)。之后

bundle install

使用

重新创建spec目录
rspec --init

并将您的xxx_spec.rb文件放在相应的目录中(如果它在spec目录中则不起作用)。初学者错误,但也许这有助于某人;)这是帮助我的链接:

https://www.relishapp.com/rspec/rspec-rails/docs/gettingstarted

答案 10 :(得分:0)

这可能在以下情况下发生:

  1. 您的规范在较新的Ruby中没有:type => :controller [type: :controller

  2. 您的规范不在控制器文件夹中,或者您没有设置config.infer_spec_type_from_file_location!

  3. 必须为您的规范设置#1或#2。此外,在这种情况下也可能发生这种情况:

    1. 您使用旧式require 'spec_helper'编写了一个规范,而不是使用较新的require 'rails_helper'。您会注意到rails_helper现在包含spec_helper(要生成两者,请参阅Rspec installation steps
    2. 交叉引用GH问题https://github.com/rails/rails-controller-testing/issues/36

答案 11 :(得分:0)

对于访问请求的获取,发布,修补和删除,您可以在request中使用controller:type

对于API Rspec,我更喜欢:request类型,对于控制器Rspec,我更喜欢简单的:controller

此处请求,

RSpec.describe ToolsController, type: 'request' do

   it "renders buttons_widgets partial" do
     get :buttons_widgets
     response.should render_template("buttons_widgets")
   end

end

答案 12 :(得分:0)

在 Gemfile 中:

在“:Test”块中,添加

gem 'rspec'

gem 'rspec-rails'

在您的测试文件中:

在测试文件之上,您还应该需要 'rails-helper' 库

**在测试文件中,当你描述控制器时,你应该提到类的类型是“控制器”,如下所示:

describe MyController, type: :controller do

注意:更改 GemFile 后不要忘记使用“捆绑安装”