невизначений метод `get 'для # <RSpec :: Core :: ExampleGroup :: Nested_1: 0x00000106db51f8>


74

Хтось знає, як це обійти? На 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)>'

чи є buttons_widgetsдія в контролері?
danneu

1
так. він скаржиться на виклик методу "get".
99miles

Якщо ви щойно перейшли на rspec 3.x і зараз отримуєте цю помилку, див. Відповідь @juankuquintana нижче
blu

Відповіді:


135

RSpec не знає, що ваша специфікація є специфікацією контролера, тому ваші приклади не мають доступу до 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-рейках README :

Специфікації контролера за замовчуванням проживають у spec/controllers folder. Позначення будь-якого контексту метаданими :type => :controllerрозглядає його приклади як специфікації контролера.

Приклад встановлення метаданих контексту контролера для RSpec:

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

я спробував spec / controlers та spec / app / controllers нічого не працювало ... але: type did: D
grosser

Те саме для мене: ../controllers/controller_spec.rb не працював. +1 для: type
тед

Моє рішення було перезапустити Spork :)
Алекс

Я помістив свій request 'spec_helper' після інших в мій тест, і це справді заплутало речі. Це рішення спрацювало для мене після того, як я спочатку поставив свою вимогу "spec_helper" +1
Єремія

Я додав type:: controller і працював .... але це дивно! Чи потрібно додавати його до всіх специфікацій контролерів? Вони вже знаходяться в папці контролерів
coorasse

25

Якщо взагалі ви використовуєте 'spec / features', можливо, вам доведеться додати наступне до вашого 'spec_helper.rb'

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

1
Під час оновлення до Capybara 2 це може бути так.
tgf

Це вирішило проблему для мене. Як сказав @tmg, я щойно оновив Capybara до 2.x
Papipo,

Дякую, друже. Випуск з останньою версією Capybara тут.
Лукаш Музика

25

У Rspec 3.x тип специфікації не визначається автоматично з розташування файлу, і його потрібно встановити вручну, додати це до spec_helper.rb

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

Rspec оновлення


Довго шукав це рішення. Дякую!
nullnullnull

Це правильна відповідь, якщо ви щойно перейшли на RSpec 3.
robbie613

2
Якщо ви використовуєте допоміжний модуль rails з RSpec 3, тип специфікації буде виведений на основі розташування файлу. Отже, немає необхідності змінювати це, поки ви require 'rails_helper'знаходитесь у верхній частині кожного файлу специфікації.
Joost Baaij

3
Коли Джоост згадав - переконайтеся, що у вас є require 'rails_helper'- ніrequire 'spec_helper'
Ендрю

це для rspec-rails
Josh Hunter

15

Я зміг виправити цю проблему в своєму додатку, додавши require 'rspec/rails'до мого файлу spec_helper.


14

Для інших, хто вивчає це. Я намагався виявити undefined method 'get'помилку. Моє питання полягає в тому , що я мав getв describe blockПереконайтеся , що ваш getзнаходиться в it block.


4
тьфу, я так сильно
зачепив

@catsby 2x facepalmed. ле 'зітхати.
дротовий зв'язок00

5

Вирішено, замінивши рядок
describe PagesController doз RSpec.describe PagesController, :type => :controller do
в _spec.rb файлу в специфікації папки.
Також для запобігання застосуванню попередження про припинення використання expect(response).to be_successзамість response should be_success.
PS: Не потрібно було додавати require "rails_helper".


2

Я отримав цю помилку, коли забув додати require 'spec_helper'у верхню частину мого специфікаційного файлу або --require spec_helperдо мого .rspec-файлу.


2

це може статися за таких умов:

  1. Ваша специфікація не має :type => :controller[ type: :controllerу новій версії Ruby]

  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


2

Якщо ви раніше rspecгенерували .rspecфайл, вам слід змінити вміст із:

--require spec_helper

до:

--require rails_helper

1

Альтернативою є вказання 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 .


0

У мене виникла ця проблема, коли я додав

gem 'rspec'

до мого Gemfile в проекті rails. Вона повинна бути

gem 'rspec'
gem 'rspec-rails'

(або просто rspec-rails). Після

bundle install

повторно створити каталог специфікацій за допомогою

rspec --init

і помістіть файл xxx_spec.rb у відповідний каталог (не буде працювати, якщо він знаходиться в каталозі специфікацій). Помилка для початківців, але, можливо, це комусь допомагає;) Ось посилання, яке мені допомогло:

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


0

Для запиту доступу отримати, опублікувати, виправити та видалити, Ви можете використовувати як, так requestі controllerв :type

Я віддаю перевагу :requestтипу для API Rspec та простому :controllerдля контролерів Rspec

Тут для запиту,

RSpec.describe ToolsController, type: 'request' do

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

end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.