web-dev-qa-db-ja.com

インスタンス変数をテストする方法は、RSpecを使用してコントローラーでインスタンス化されました

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つのインスタンスを比較しようとしているためです。したがって、コントローラーがクライアントモデルの新しいインスタンスを保持するインスタンス変数を設定していることを確認するにはどうすればよいですか。

35
fakingfantastic

#rspecのtechnicalpicklesは私を助けてくれました...

assigns(:client).should be_kind_of(Client)
37
fakingfantastic

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

16
Attila Györffy

その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の回答 を参照してください。

15
Epigene