RSPEC在控制器和固定器上
-
02-10-2019 - |
题
我对使用RSPEC的新手很陌生,并且正在尝试为控制器编写测试。我有这个控制器(我正在使用摩卡咖啡来固定):
class CardsController < ApplicationController
before_filter :require_user
def show
@cardset = current_user.cardsets.find_by_id(params[:cardset_id])
if @cardset.nil?
flash[:notice] = "That card doesn't exist. Try again."
redirect_to(cardsets_path)
else
@card = @cardset.cards.find_by_id(params[:id])
end
end
end
我试图用这样的事情来测试这一动作:
describe CardsController, "for a logged in user" do
before(:each) do
@cardset = Factory(:cardset)
profile = @cardset.profile
controller.stub!(:current_user).and_return(profile)
end
context "and created card" do
before(:each) do
@card = Factory(:card)
end
context "with get to show" do
before(:each) do
get :show, :cardset_id => @cardset.id, :id => @card.id
end
context "with valid cardset" do
before(:each) do
Cardset.any_instance.stubs(:find).returns(@cardset)
end
it "should assign card" do
assigns[:card].should_not be_nil
end
it "should assign cardset" do
assigns[:cardset].should_not be_nil
end
end
end
end
end
“应该分配卡片”测试通过,但我无法弄清楚如何正确固执 @card = @cardset.cards.find_by_id(params[:id])
对于“应该分配卡”测试。测试此操作的最佳方法是什么,或者如果我在正确的轨道上,我将如何正确地拨打模型呼叫?
解决方案 2
我最终寻找这些的存根
Cardset.stubs(:find_by_id).returns(@cardset)
@cardset.cards.stubs(:find_by_id).returns(@card)
其他提示
好的,删除了以前的答案。
首先:你正在固执 find
不是 find_by_id
. 。尽管您不需要使用find_by_id,因为这是查找的默认值。所以使用 find
第二: before :each
订购将打电话给 get :show
在你存根之前 Cardset
第三:检查您的test.log,并确保您没有重定向。您的 require_user
动作可能会导致重定向 current_user
甚至设置。
class CardsController < ApplicationController
...
@card = @cardset.cards.find(params[:id])
...
end
describe CardsController, "for a logged in user" do
before(:each) do
@cardset = Factory(:cardset)
profile = @cardset.profile
controller.stub!(:current_user).and_return(profile)
end
context "and created card" do
before(:each) do
@card = Factory(:card)
end
context "with get to show" do
context "with valid cardset" do
before(:each) do
Cardset.any_instance.stubs(:find).returns(@cardset)
get :show, :cardset_id => @cardset.id, :id => @card.id
end
it "should assign card" do
assigns[:card].should_not be_nil
end
it "should assign cardset" do
assigns[:cardset].should_not be_nil
end
end
end
end
end
不隶属于 StackOverflow