ChatGPT解决这个技术问题 Extra ChatGPT

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

有谁知道如何解决这个问题?在 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 动作吗?
是的,我愿意。它抱怨“get”方法调用。
如果您刚刚升级到 rspec 3.x 并且现在遇到此错误,请参阅下面的@juankuquintana 答案

C
Community

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

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

这在 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-inference-disabled

rspec-rails README 中:

控制器规格默认位于 spec/controllers 文件夹中。使用元数据标记任何上下文 :type => :controller 将其示例视为控制器规范。

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

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

我尝试了 spec/controllers 和 spec/app/controllers 没有任何效果......但是:type 确实:D
对我来说也是一样:../controllers/controller_spec.rb 不起作用。 +1 为:类型
我的解决方案是重新启动 Spork :)
我在我的测试中将我的 require 'spec_helper' 放在了其他要求之后,这真的把事情搞砸了。在我把我的 require 'spec_helper' 放在第一位之后,这个解决方案对我有用。 +1
我添加了 type: :controller 并工作了....但很奇怪!我是否必须将其添加到所有控制器规范中?他们已经在控制器文件夹下
k
koopajah

如果您使用的是“spec/features”,您可能需要将以下内容添加到您的“spec_helper.rb”中

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

更新到 Capybara 2 时,可能会出现这种情况。
这为我解决了这个问题。正如@tmg 所说,我刚刚将 Capybara 升级到 2.x
谢了哥们。最新Capybara的问题在这里。
j
juankuquintana

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

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

Rspec upgrade


花了很长时间寻找这个解决方案。谢谢!
如果您刚刚升级到 RSpec 3,这是正确的答案。
如果您使用 RSpec 3 中的 rails 助手,规范类型 根据文件位置推断。因此,只要您在每个规范文件的顶部require 'rails_helper',就无需更改此设置。
正如 Joost 所暗示的那样 - 确保你有 require 'rails_helper' - 而不是 require 'spec_helper'
这是用于 rspec-rails
P
Peter Brown

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


s
superstar3000

对于其他调查此问题的人。我试图找出一个 undefined method 'get' 错误。我的问题是我在 describe block 中有 get,确保您的 getit block 中。


啊,当我读到这篇文章时,我脸色难看,它解决了我的问题:/
@catsby 2x 捂脸。叹息。
c
curtis jacques

通过将 spec 文件夹中 _spec.rb 文件中的
describe PagesController do 行替换为 RSpec.describe PagesController, :type => :controller do
来解决。
为了防止弃用警告,请使用 expect(response).to be_success 而不是 { 4}.
PS:不必添加require "rails_helper"


B
Brad Werth

当我忘记将 require 'spec_helper' 添加到我的规范文件的顶部或将 --require spec_helper 添加到我的 .rspec 文件时,我收到了这个错误。


J
Jason FB

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

您的规范没有 :type => :controller [type: :controller in newer Ruby] 您的规范不在控制器文件夹中,或者您没有设置 config.infer_spec_type_from_file_location!

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

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

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


A
Aleks

如果您使用 rspec 生成 .rspec 文件,则应将内容从:

--require spec_helper

至:

--require rails_helper

R
RubyFanatic

另一种方法是为您的规范指定 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


J
Johannes Thoma

我添加时遇到了这个问题

gem 'rspec'

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

gem 'rspec'
gem 'rspec-rails'

(或只是 rspec-rails)。后

bundle install

重新创建规范目录

rspec --init

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

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


F
Foram

对于访问请求获取、发布、修补和删除,您可以在 :type 中同时使用 requestcontroller

我更喜欢 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

M
Mohammad Bon

在 Gemfile 中:

在 ":Test" 块中,添加

gem 'rspec'

gem 'rspec-rails'

在您的测试文件中:

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

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

describe MyController, type: :controller do

注意:更改 GemFile 后不要忘记使用 'Bundle install'


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅