Доступ к переменным экземпляра контроллера из спецификации контроллера rspec

Не могу ли я увидеть переменные экземпляра, которые создаются в действии контроллера из моих тестов rspect?

# /app/controllers/widget_controller.rb
...
def show
  @widget = ...
  puts "in controller: #{@widget}"
end
...

-

# /spec/controllers/widget_controller_spec.rb
RSpec.describe WidgetController, type: :controller do
...
describe "GET #show" do
  it "assigns the requested widget as @widget" do
    get :show, { :id => 1 } # this is just an example - I'm not hardcoding the id

    puts "in spec: #{@widget}"
  end
end
...

Вот результат, который я получаю, когда запускаю эту спецификацию:

controller: #<Widget:0x007f9d02aff090>
in spec:

Я ошибаюсь, думая, что у меня должен быть доступ к @widget в спецификации моего контроллера?

Ответ 1

Используйте метод assigns:

it "assigns the @widget"
  expect(assigns(:widget)).not_to be_nil
end

Конечно, вы можете проверить widget как хотите, но не видя, что @widget из вашего предоставленного кода контроллера, я просто проверил, было ли это nil

Если вы хотите puts виджет, как в вашем примере, просто распечатайте его с помощью assigns

puts assigns(:widget)

Ответ 2

В Rails 5, assigns теперь выделены в новый rails-controller-testing камень.

Вы можете либо установить гем, чтобы продолжить использовать assigns, либо использовать то, что использует само гем rails-controller-testing, которое @controller.view_assigns[].

Ответ 3

# назначает не рекомендуется. Здесь решение, которое позволяет избежать использования драгоценного камня rails-controller-testing test

Хотя для проверки переменных экземпляра в контроллерах может показаться запах кода, для обновления старых приложений можно использовать #instance_variable_get.

Пример спецификации: expect(@controller.instance_variable_get(:@person).id).to eq(person_id)