當試圖取消關注的用戶不存在時,我會拋出一個異常來設置Flash錯誤消息,並將用戶重定向回到他們所在的頁面。如何使用RSpec在已存在的控制器方法上存根方法?
所有對twitter gem的訪問都由TwitterManager類處理,它是一個常規的ruby類,它擴展了ActiveModel :: Naming來啓用mock_model。
現在我有一個真正的困難時間搞清楚這應該如何測試。下面的代碼工作,但感覺非常錯誤。唯一可以將twitter.unfollow方法存根的方法是使用controller.send(:twitter).stub(:unfollow).and_raise(Twitter :: Error :: NotFound.new(「」,{}))
我嘗試使用TwitterManager.any_instance.stub(:unfollow),但那顯然沒有做我認爲會做的事情。
我該如何做得更好?我完全誤解了什麼?
規格
describe TwitterController do
before(:each) do
controller.stub(:twitter).and_return(mock_model("TwitterManager", unfollow: true, follow: true))
end
it "unfollows a user when given a nickname" do
@request.env['HTTP_REFERER'] = '/followers'
post 'unfollow', id: "existing_user"
response.should redirect_to followers_path
end
describe "POST 'unfollow'" do
it "does not unfollow a user that does not exist" do
controller.send(:twitter).stub(:unfollow).and_raise(Twitter::Error::NotFound.new("", {}))
@request.env['HTTP_REFERER'] = '/followers'
post 'unfollow', id: "non_existing_user"
flash[:error].should_not be_nil
flash[:error].should have_content("not found, could not unfollow")
response.should redirect_to followers_path
end
end
控制器
def unfollow
begin
twitter.unfollow(params[:id])
respond_to do |format|
format.html { redirect_to :back, notice: "Stopped following #{params[:id]}" }
end
rescue Twitter::Error::NotFound
redirect_to :back, :flash => { error: "User #{params[:id]} not found, could not unfollow user" }
end
end
[更多代碼]
private
def twitter
twitter_service ||= TwitterFollower.new(current_user)
end
Rspec的2.8.0 的Rails 3.2.0