2016-05-23 12 views
0

Lassen Sie sagen, ich habe ein Setup wie folgt aus:RSpec Controller für verschachtelte Ressourcen, before_action

config/routes.rb

resources :graves do 
    resources :candles 
    end 

app/models/grave.rb

has_many :candles, dependent: :destroy 

app/modelle/kerzen.rb

belongs_to :grave 

app/cont

Rollen/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 

spec/controllers/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 

Problem ist, wenn ich diese spec laufen bekomme ich diesen Fehler:

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

ich eingecheckt haben factory und @grave ist so erstellt, es ist nicht Null. Wenn ich manuell teste, wird candle korrekt erstellt und mit grave verknüpft. Irgendwelche Hinweise, die zum Versagen der Spec führen können?

Rails 4.2, RSpec 3.x

Antwort

1

Ihre Route wird wie folgt aussehen: graves/:grave_id/candles, so dass Sie ein @grave.id auf Ihre post Methode als grave_id passieren müssen.

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