web-dev-qa-db-ja.com

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にアクセスする必要があると思うのは間違っていますか?

21
RobertJoseph

assignsメソッドを使用する* noteassignsは廃止されました。下部を参照してください情報に対する私の回答の)

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

もちろん、widgetを好きなように検査できますが、何を見なくても@widgetは提供されたコントローラーコードからのものです。nilかどうかを確認しました

例のようにウィジェットをputsしたい場合は、assignsでウィジェットを印刷します。

puts assigns(:widget)

EDIT:assignsは非推奨になりました(参照: https://apidock.com/Rails/ActionController/TestProcess/割り当て

assignsを引き続き使用する場合は、 Rails-controller-testing gemをインストールする必要があります。

それ以外の場合は、gemが内部で使用するRails-controller-testingを使用できます:@controller.view_assigns[]

27
Wes Foster

Rails 5では、assignsが新しいRails-controller-testing gemに分割されました。

Gemをインストールしてassignsを引き続き使用するか、Rails-controller-testing gemが内部で使用するwhich@controller.view_assigns[]を使用できます。

11
Will Clarke

assigns は非推奨です。以下は、_Rails-controller-testing_ gemの取り込みを回避するソリューションです

コントローラでインスタンス変数をテストする場合は code smell にすることができますが、古いアプリをアップグレードする場合は #instance_variable_get を利用できます。

Rspecの例:expect(@controller.instance_variable_get(:@person).id).to eq(person_id)

10
stevepentler