74 votes

Méthode indéfinie 'get' pour #<RSpec::Core::ExampleGroup::Nested_1:0x00000106db51f8>.

Quelqu'un sait comment contourner ce problème ? Sur OSX, j'essaie de faire fonctionner RSpec avec Rails 3.0.7. Tous les détails sont disponibles sur le site : 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)>'

0 votes

Existe-t-il un buttons_widgets dans le contrôleur ?

1 votes

Oui, je le sais. Il se plaint de l'appel de la méthode 'get'.

0 votes

Si vous venez d'effectuer une mise à jour vers rspec 3.x et que vous obtenez maintenant cette erreur, consultez la réponse de @juankuquintana ci-dessous.

135voto

Rob Davis Points 7639

RSpec ne sait pas que votre spécification est une spécification de contrôleur, de sorte que vos exemples n'ont pas accès à une spécification de contrôleur. get méthode.

RSpec 2.x suppose que tout ce qui se trouve dans le répertoire des contrôleurs est une spécification de contrôleur.

Ceci a été modifié dans RSpec 3 :

L'inférence du type de fichier est désactivée par défaut

Auparavant, nous déduisions automatiquement le type de spécification à partir de l'emplacement d'un fichier, ce qui était un comportement surprenant pour les nouveaux utilisateurs et indésirable pour certains utilisateurs expérimentés. Ainsi, à partir de RSpec 3, ce comportement doit être explicitement accepté :

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

Dans le rspec-rails README :

Les spécifications du contrôleur résident par défaut dans le spec/controllers folder . Marquage de tout contexte avec les métadonnées :type => :controller traite ses exemples comme des spécifications de contrôleur.

Un exemple de définition des métadonnées du contexte du contrôleur pour RSpec :

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

0 votes

J'ai essayé spec/controllers et spec/app/controllers mais rien n'a fonctionné... mais :type oui :D

0 votes

La même chose pour moi : ../controllers/controller_spec.rb n'a pas fonctionné. +1 pour :type

0 votes

Ma solution a été de redémarrer Spork :)

25voto

juankuquintana Points 191

Dans Rspec 3.x le type de spécification n'est pas automatiquement déduit de l'emplacement du fichier, et vous devez le définir manuellement, ajoutez ceci au fichier spec_helper.rb

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

Mise à niveau de Rspec

0 votes

J'ai passé beaucoup de temps à chercher cette solution. Merci !

0 votes

C'est la bonne réponse si vous venez de passer à RSpec 3.

2 votes

Si vous utilisez l'aide rails de RSpec 3, le type de spec sera être déduit en fonction de l'emplacement du fichier. Il n'y a donc pas besoin de changer cela tant que vous require 'rails_helper' en tête de chaque fichier de spécification.

25voto

Hamza Points 221

Si vous utilisez 'spec/features', vous devrez peut-être ajouter ce qui suit à votre fichier 'spec_helper.rb'.

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

1 votes

Lors de la mise à jour vers Capybara 2, cela peut être le cas.

0 votes

Cela a réglé le problème pour moi. Comme @tmg l'a dit, je viens de mettre à jour Capybara en 2.x.

0 votes

Merci, mon pote. Problème avec le dernier Capybara ici.

15voto

Beerlington Points 25012

J'ai pu résoudre ce problème dans mon application en ajoutant require 'rspec/rails' à mon fichier spec_helper.

14voto

superstar3000 Points 25

Pour les autres qui se penchent sur la question. J'essayais de trouver un undefined method 'get' erreur. Mon problème était que j'avais le get dans un describe block assurez-vous que votre get est dans un it block .

4 votes

Ugh j'ai fait une grimace quand j'ai lu ça et ça a réglé mon problème :/

0 votes

@catsby 2x facepalmed. le' sigh.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X