コントローラでは、
def admin_search
@admins = User.find(:all,:joins=>[:roles],:conditions=>["name IN (?) and email like '#{params[:email]}%'",["content team","ops team"]]).paginate(:page => params[:page], :per_page => 10)
end
rspecのコードを教えてください
コントローラでは、
def admin_search
@admins = User.find(:all,:joins=>[:roles],:conditions=>["name IN (?) and email like '#{params[:email]}%'",["content team","ops team"]]).paginate(:page => params[:page], :per_page => 10)
end
rspecのコードを教えてください
まず、find(:all, ...)
ユーザーモデルへの呼び出しを抽出することをお勧めします。たとえば、それを呼び出しsearch
ます。
class User < ActiveRecord::Base
scope :search_by_email, lambda { |email|
joins(:roles).where(["name IN (?) and email like '#{email}%'",["content team","ops team"]])
}
end
次に、コントローラーで使用します。
def admin_search
@admins = User.search_by_email(params[:email]).paginate(:page => params[:page], :per_page => 10)
end
これで、メソッドを個別にテストできます。search_by_email
「コンテンツチーム」と「運用チーム」の結果のみが返され、空のメール文字列などで正しく機能することを確認してください。
paginate
メソッドは、kaminari、will_paginate、または使用するものですでにテストされているはずなので、テストする必要はないと思います。should_receive
ただし、コントローラーの仕様でモック期待値()を使用できるよりも、呼び出されていることを確認したい場合。
編集:スペックはどのように見えるか
describe User do
describe ".search_by_email" do
let(:content_team) { Role.create! name: "content team" }
let(:ops_team) { Role.create! name: "ops team" }
let(:another_team) { Role.create! name: "another team" }
it "should search in content team" do
content_team_user = User.create! email: "joe.black@example.com", roles: [content_team]
User.search_by_email("black").should == [content_team_user]
end
it "should search in ops team" do
ops_team_user = User.create! email: "joe.black@example.com", roles: [ops_team]
User.search_by_email("black").should == [ops_team_user]
end
it "should not search in other teams" do
other_team_user = User.create! email: "joe.black@example.com", roles: [another_team]
User.search_by_email("black").should == []
end
it "should not search by empty string" do
content_team_user = User.create! email: "joe.black@example.com", roles: [content_team_user]
User.search_by_email("").should == []
User.search_by_email(nil).should == []
end
# more specs for search...
end
end
describe UsersController do
describe "admin search" do
let(:admin_user) { double(:admin_user).as_null_object }
let(:search_string) { 'joe' }
it "should search for admin users" do
User.should_receive(:search_by_email).with(search_string).and_return([admin_user])
get :admin_search, email: search_string
assigns(:admins).should == [admin_user]
end
end
end