Доступ к переменным экземпляра контроллера из спецификации контроллера 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)