最近、最初のRails3アプリにDeviseを追加しましたが、コントローラーのテストで少し問題が発生しています。
Deviseが使用しているのと同じモデルであるUserコントローラークラスをテストしています。だから私のスペックの初めに私はこれを持っています:
before(:each) do
sign_in @user = Factory.create(:user)
end
これで、次のようにモックやスタブを使用せずにテストに合格できます。
describe "GET edit" do
it "assigns the requested user as @user" do
user = Factory(:user)
get :edit, :id => user.id
assigns(:user).should eql(user)
end
end
しかし、教育目的で、モックとスタブで動作させる方法を知りたいのですが、通常は完全に簡単ですが、DeviseがUser.find
コントローラーのアクションの前に呼び出して、テストを失敗させているようです。
describe "GET edit" do
it "assigns the requested user as @user" do
user = Factory(:user)
User.expects(:find).with(:first, :conditions => {:id => 37}).returns(user)
get :edit, :id => '37'
assigns(:user).should be(user)
end
end
また、期待値に追加twice
すると、最初のfindの呼び出しが、期待値を設定している呼び出しとは異なるため、これも失敗します。
任意の洞察をいただければ幸いです。