私の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にアクセスする必要があると思うのは間違っていますか?
assigns
メソッドを使用する(* note:assigns
は廃止されました。下部を参照してください情報に対する私の回答の):
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[]
Rails 5では、assigns
が新しいRails-controller-testing
gemに分割されました。
Gemをインストールしてassigns
を引き続き使用するか、Rails-controller-testing
gemが内部で使用するwhich@controller.view_assigns[]
を使用できます。
# assigns は非推奨です。以下は、_Rails-controller-testing
_ gemの取り込みを回避するソリューションです
コントローラでインスタンス変数をテストする場合は code smell にすることができますが、古いアプリをアップグレードする場合は #instance_variable_get を利用できます。
Rspecの例:expect(@controller.instance_variable_get(:@person).id).to eq(person_id)