undefinierte Methode `get 'für # <RSpec :: Core :: ExampleGroup :: Nested_1: 0x00000106db51f8>


74

Weiß jemand, wie man das umgeht? Versuchen Sie unter OSX, RSpec mit Rails 3.0.7 zum Laufen zu bringen. Ausführliche Informationen unter: 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)>'

Gibt es eine buttons_widgetsAktion in der Steuerung?
— Danneu

1
ja, ich will. Es beschwert sich über den Methodenaufruf 'get'.
— 99 Meilen

Wenn Sie gerade ein Upgrade auf rspec 3.x durchgeführt haben und jetzt diesen Fehler erhalten, lesen Sie die Antwort unten unter @juankuquintana
— blu

Antworten:


134

RSpec weiß nicht, dass Ihre Spezifikation eine Controller-Spezifikation ist, daher haben Ihre Beispiele keinen Zugriff auf eine getMethode.

RSpec 2.x geht davon aus, dass alles im Controller-Verzeichnis eine Controller-Spezifikation ist.

Dies wurde in RSpec 3 geändert:

Dateityp-Inferenz standardmäßig deaktiviert

Zuvor haben wir den Spezifikationstyp automatisch aus einem Dateispeicherort abgeleitet. Dies war ein überraschendes Verhalten für neue Benutzer und für einige erfahrene Benutzer unerwünscht. Ab RSpec 3 muss dieses Verhalten explizit aktiviert werden mit:

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

In der rspec-Rails README :

Die Controller-Spezifikationen befinden sich standardmäßig in der spec/controllers folder. Wenn Sie einen Kontext mit den Metadaten :type => :controllermarkieren, werden die Beispiele als Controller-Spezifikationen behandelt.

Ein Beispiel für das Festlegen der Controller-Kontext-Metadaten für RSpec:

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

Ich habe versucht, Spec / Controller und Spec / App / Controller nichts hat funktioniert ... aber: Typ hat: D
— Grosser

Das gleiche für mich: ../controllers/controller_spec.rb hat nicht funktioniert. +1 für: Typ
— ted

Meine Lösung war, Spork neu zu starten :)
— Aleks

Ich habe meine Anforderung 'spec_helper' nach anderen Anforderungen in meinen Test gestellt, und das hat die Dinge wirklich durcheinander gebracht. Diese Lösung hat bei mir funktioniert, nachdem ich zuerst meine Anforderung 'spec_helper' gesetzt habe. +1
— Jeremiah

Ich habe Typ :: Controller hinzugefügt und gearbeitet .... aber ist seltsam! Muss ich es allen Controllerspezifikationen hinzufügen? Sie sind bereits unter Controller Ordner
— Coorasse

25

Wenn Sie überhaupt 'spec / features' verwenden, müssen Sie möglicherweise Folgendes zu Ihrer 'spec_helper.rb' hinzufügen.

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

1
Bei der Aktualisierung auf Capybara 2 kann dies der Fall sein.
— tgf

Dies hat das Problem für mich behoben. Wie @tmg sagte, habe ich gerade Capybara auf 2.x aktualisiert
— Papipo

Danke Kumpel. Problem mit dem neuesten Capybara hier.
— Lukasz Muzyka

25

In Rspec 3.x wird der Spezifikationstyp nicht automatisch aus einem Dateispeicherort abgeleitet, und Sie müssen ihn manuell festlegen. Fügen Sie ihn der Datei spec_helper.rb hinzu

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

Rspec-Upgrade


Ich habe lange nach dieser Lösung gesucht. Vielen Dank!
— nullnullnull

Dies ist die richtige Antwort, wenn Sie gerade auf RSpec 3 aktualisiert haben.
— robbie613

2
Wenn Sie die Schienen Helfer aus RSpec 3 verwenden, der Spec - Typ wird basierend auf dem Speicherort der Datei zu entnehmen. Sie müssen dies also nicht ändern, solange Sie sich require 'rails_helper'oben in jeder Spezifikationsdatei befinden.
— Joost Baaij

3
Wie Joost sagte - stellen Sie sicher, dass Sie require 'rails_helper'- nichtrequire 'spec_helper'
— Andrew

Dies ist für Rspec-Rails
— Josh Hunter

15

Ich konnte dieses Problem in meiner App beheben, indem ich require 'rspec/rails'es meiner spec_helper-Datei hinzufügte .


14

Für andere, die sich damit befassen. Ich habe versucht, einen undefined method 'get'Fehler aufzuspüren . Mein Problem war, dass ich das getin einem hatte, describe blockum sicherzustellen, dass Ihr getin einem ist it block.


4
ugh ich Gesicht so hart
— palpaled,

@catsby 2x facepalmed. le 'seufz.
— Wired00

5

Gelöst durch Ersetzen der Zeile
describe PagesController dodurch RSpec.describe PagesController, :type => :controller do
in der Datei _spec.rb im Ordner spec.
Auch um Verfallswarnungen zu vermeiden, verwenden Sie expect(response).to be_successstatt response should be_success.
PS: Musste nicht hinzufügen require "rails_helper".


2

Ich habe diesen Fehler erhalten, als ich vergessen habe require 'spec_helper', oben in meine Spezifikationsdatei oder --require spec_helperin meine .rspec-Datei einzufügen.


2

Dies kann unter folgenden Bedingungen geschehen:

  1. Ihre Spezifikation hat nicht :type => :controller[ type: :controllerin neuerem Ruby]

  2. Ihre Spezifikation befindet sich nicht im Controller-Ordner oder Sie haben nicht festgelegt config.infer_spec_type_from_file_location!

Entweder Nr. 1 oder Nr. 2 muss für Ihre Spezifikation eingerichtet werden. Dies kann auch unter dieser Bedingung geschehen:

  1. Sie haben eine Spezifikation im alten Stil require 'spec_helper'anstatt im neueren geschrieben require 'rails_helper'. Sie werden feststellen, dass dies rails_helperjetzt beinhaltet spec_helper(um beide zu generieren, lesen Sie die Rspec-Installationsschritte ).

Querverweis auf GH-Problem https://github.com/rails/rails-controller-testing/issues/36


2

Wenn Sie rspecdie .rspecDatei generiert haben , sollten Sie den Inhalt ändern von:

--require spec_helper

zu:

--require rails_helper

1

Eine Alternative besteht darin, type: :requestfür Ihre Spezifikation anzugeben . Zum Beispiel:

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

Beispiel von hier https://www.relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec .


0

Ich hatte dieses Problem, als ich hinzufügte

gem 'rspec'

zu meinem Gemfile im Rails-Projekt. Es sollte sein

gem 'rspec'
gem 'rspec-rails'

(oder einfach nur rspec-schienen). Nach

bundle install

Erstellen Sie das Spezifikationsverzeichnis mit neu

rspec --init

und legen Sie Ihre xxx_spec.rb-Datei im entsprechenden Verzeichnis ab (funktioniert nicht, wenn sie sich im Spezifikationsverzeichnis befindet). Anfängerfehler, aber vielleicht hilft das jemandem;) Hier ist der Link, der mir geholfen hat:

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


0

Für Zugriffsanforderungen zum Abrufen, Veröffentlichen, Patchen und Löschen können Sie sowohl requestals auch controllerin verwenden :type

Ich bevorzuge :requestTyp für API Rspec und einfach :controllerfür Controller Rspec

Hier für Anfrage,

RSpec.describe ToolsController, type: 'request' do

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

end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.