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)>'
99 Meilen
quelle
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
Rob Davis
quelle
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
Hamza
quelle
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

Juankuquintana
quelle
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 .

Peter Brown
quelle
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.

superstar3000
quelle
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".

Curtis Jacques
quelle
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.

Brad Werth
quelle
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

Jason FB
quelle
2

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

--require spec_helper

zu:

--require rails_helper
Aleks
quelle
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 .

RubyFanatic
quelle
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

Johannes Thoma
quelle
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
Foram Thakral
quelle