RESTfulコントローラーの新しいアクションが必要なオブジェクトタイプのインスタンス変数を設定することを確認しようとしています。かなり典型的なようですが、実行に問題があります
クライアントコントローラー
def new
@client = Client.new
end
テスト
describe "GET 'new'" do
it "should be successful" do
get 'new'
response.should be_success
end
it "should create a new client" do
get 'new'
assigns(:client).should == Client.new
end
end
結果は...
'ClientsController GET' new 'は新しいクライアントを作成する必要があります' FAILED 期待:#、 取得:#(==を使用)
これはおそらく、異なるアクティブレコードの2つのインスタンスを比較しようとしているためです。したがって、コントローラーがクライアントモデルの新しいインスタンスを保持するインスタンス変数を設定していることを確認するにはどうすればよいですか。
#rspecのtechnicalpicklesは私を助けてくれました...
assigns(:client).should be_kind_of(Client)
Railsのnew_recordを使用できますか?特定のインスタンスがデータベースにすでに保存されているかどうかを確認する方法:
assigns(:client).should be_a(Client)
assigns(:client).should be_new_record
(歴史的な理由から、assigns [:client]を使用することはできません: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse )
その2016RSpec v3構文の使用:
expect(assigns(:client)).to be_a(Client)
また、質問のタイトルが原因でここで停止する可能性がある他のユーザーのために、インスタンス変数@client
が何かに設定されているかどうかをテストする方法を次に示します。
# in controller action
@client = Client.find_by(name: "John")
# spec assignment based on collection membership
expect(assigns.keys).to include('client')
割り当てハッシュに文字列キーでアクセスする必要がある理由については、 @AttilaGyörffyの回答 を参照してください。