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.