# < RSpec: : Core: : ExampleGroup: : Nsted_1:0x0000106db51f8 > 的未定义方法‘ 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)>'
41448 次浏览

RSpec 不知道您的 spec 是控制器规范,所以您的示例不能访问 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-ails 自述文件:

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

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

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

通过将 require 'rspec/rails'添加到 spec _ helper 文件中,我能够修复应用程序中的这个问题。

如果您正在使用“ spec/properties”,那么您可能需要将以下内容添加到“ spec _ helper. rb”中

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

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

在 Rspec 3.x 中,spec 类型不会从文件位置自动推断出来,您必须手动设置它,并将其添加到 spec _ helper 中。RB

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

视觉系统升级

对于其他调查此事的人来说。我试图追踪一个 undefined method 'get'错误。我的问题是,我有 get在一个 describe block确保你的 get是在一个 it block

通过更换线路解决了这个问题
describe PagesController doRSpec.describe PagesController, :type => :controller do
我不知道文件的 spec 文件夹中。 < br > 为了防止弃用警告使用 expect(response).to be_success代替 response should be_success。 < br > 附注: 不需要添加 require "rails_helper"

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

当我加入

gem 'rspec'

我的 Gemfile 在轨道项目。它应该是

gem 'rspec'
gem 'rspec-rails'

(或只是 rspec-ails)

bundle install

重新创建 spec 目录

rspec --init

并把你的 xxx _ spec。Rb 文件放在适当的目录中(如果它在 spec 目录中就不能工作)。初学者会犯错误,但也许这对某些人有帮助;)下面是帮助我的链接:

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

在下列情况下可能发生这种情况:

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

  2. 您的规范不在控制器文件夹中,或者您没有设置 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

如果使用 rspec生成 .rspec文件,则应该将内容从以下部分更改为:

--require spec_helper

致:

--require rails_helper

对于访问请求获取、发布、修补和删除,可以在 :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

在 Gemfile:

在“ : Test”块中,添加

gem 'rspec'


gem 'rspec-rails'

在您的测试文件中:

在测试文件的顶部,您还应该需要“ ails-helper”库

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

describe MyController, type: :controller do

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