2016-05-23 78 views
0

让说我有设置是这样的:RSpec的控制器嵌套的资源,before_action

的config/routes.rb中

resources :graves do 
    resources :candles 
    end 

应用程序/模型/ grave.rb

has_many :candles, dependent: :destroy 

应用程序/模型/蜡烛.rb

belongs_to :grave 

app/cont辊/ candles_controller.rb

before_action :get_grave 

def create 
    @candle = @grave.candles.new(candle_params) 
    respond_to do |format| 
     if @candle.save 
     format.html { 
      redirect_to @grave, notice: 'Candle was successfully created.' 
     } 
     format.json { } 
     else 
     format.html { render :new } 
     format.json { render json: @candle.errors, status: :unprocessable_entity } 
     end 
    end 
end 

private 
def candle_params 
    params.require(:candle).permit(:name, :body) 
end 

def get_grave 
    @grave = Grave.find(params[:grave_id]) 
end 

规格/控制器/ candles_controller_spec.rb

describe CandlesController, type: :controller do 
    describe "POST create" do 
    before(:each) do 
     @grave = FactoryGirl.create(:grave) 
    end 
    it "creates candle" do 
     post :create, candle: { name: "Dummy name", body: "Dummy body", grave_id: @grave.id} 
     expect(response).to redirect_to(@grave) 
    end 
    end 
end 

问题是,当我运行这个天赋,我得到这个错误:

1) CandlesController POST create creates candle Failure/Error: expect(response).to redirect_to(@grave) Expected response to be a < redirect >, but was <404>

我检查FactoryGirl并且@grave被创建,所以它不是零。当我手动测试candle已正确创建并且它与grave关联。任何可能导致spec失败的线索?

的Rails 4.2,RSpec的3.X

回答

1

您的路线将如下所示:graves/:grave_id/candles,让您拥有一个@grave.id传递给你的post方法grave_id

post :create, grave_id: @grave.id, candle: { name: "Dummy name", body: "Dummy body", grave_id: @grave.id}