#<RSpec :: Core :: ExampleGroup :: Nested_1:0x00000106db51f8>的未定义方法`get'


74

有人知道如何解决这个问题吗?在OSX上,尝试使RSpec与Rails 3.0.7一起运行。有关详细信息,请访问: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)>'

buttons_widgets控制器中有动作吗?
danneu 2011年

1
是的,我愿意。它抱怨“ get”方法调用。
2011年

如果你刚刚升级到rspec的3.x和现在得到这个错误看到@juankuquintana回答楼下
蓝光

Answers:


135

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

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

这在RSpec 3中已更改:

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

以前,我们从文件位置自动推断规范类型,这对于新用户而言是令人惊讶的行为,而对于某些资深用户而言则是不希望的,因此从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-in​​ference-disabled

rspec-rails README中

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

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

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

我试过规格/控制器和规格/应用/控制器什么都没用...但是:type确实:D
总体而言,

对我来说也一样:../ controllers / controller_spec.rb无法正常工作。+1:type
ted

我的解决方案是重新启动Spork :)
Aleks

我在测试中将我的要求'spec_helper'放在其他要求之后,这确实把事情搞砸了。在我将我的要求“ spec_helper”放在首位之后,该解决方案为我工作。+1
耶利米2013年

我添加了类型::controller and work ....但是很奇怪!我是否必须将其添加到所有控制器规格中?他们已经
管理员

25

如果您完全使用“ spec / features”,则可能需要在“ spec_helper.rb”中添加以下内容

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

1
当更新到水豚2时,可能是这种情况。
tgf

这为我解决了这个问题。正如@tmg所说,我刚刚将
Capybara

谢了哥们。在这里发布最新的水豚。
Lukasz Muzyka

25

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

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

Rspec升级


花了很长时间寻找这种解决方案。谢谢!
nullnullnull14年

这是一个正确的答案,如果你刚才3.升级到RSpec的
robbie613

2
如果使用RSpec 3中的rails helper,根据文件位置推断规范类型。因此,只要您require 'rails_helper'位于每个规格文件的顶部,就无需更改此设置。
Joost Baaij 2014年

3
由于Joost的aluded到-确保你有require 'rails_helper'-不require 'spec_helper'
安德鲁

这是用于rspec-rails
Josh Hunter

15

通过添加require 'rspec/rails'到spec_helper文件,我能够在我的应用程序中解决此问题。


14

对于其他正在寻找这个。我正在尝试查找undefined method 'get'错误。我的问题是,我有get一个describe block确保你get是在it block


4
恩,当我读到这篇文章时,我面
无表情

@catsby 2x脸色苍白。'。
有线00年

5

通过替换线解决
describe PagesController doRSpec.describe PagesController, :type => :controller do
_spec.rb在规范文件夹文件。
另外,为了防止弃用警告,请使用expect(response).to be_success代替response should be_success
PS:不必添加require "rails_helper"


2

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


2

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

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

  2. 您的规格不在controllers文件夹中,或者您尚未设置 config.infer_spec_type_from_file_location!

必须为您的规格设置#1或#2。同样,在这种情况下也可能发生这种情况:

  1. 您已使用旧样式require 'spec_helper'而不是使用较新的编写了规范require 'rails_helper'。您会注意到,rails_helper现在包括spec_helper(要生成两者,请参阅Rspec安装步骤

交叉引用GH问题https://github.com/rails/rails-controller-testing/issues/36


2

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

--require spec_helper

至:

--require rails_helper

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


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


0

对于访问请求GET,POST,补丁和删除,您可以同时使用request,并controller:type

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

在这里要求

RSpec.describe ToolsController, type: 'request' do

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

end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.