嵌套资源的 RSpec 控制器,before_action [英] RSpec controller for nested resources, before_action
问题描述
假设我有这样的设置:
config/routes.rb
config/routes.rb
resources :graves do
resources :candles
end
app/models/grave.rb
app/models/grave.rb
has_many :candles, dependent: :destroy
app/models/candles.rb
app/models/candles.rb
belongs_to :grave
app/controllers/candles_controller.rb
app/controllers/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
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 is when I run this spec I get this error:
1) CandlesController POST create 创建蜡烛失败/错误:期望(响应).重定向到(@grave)预期响应为 <重定向 >,但是是 <404>
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
相关联.任何可能导致规范失败的线索?
I've checked FactoryGirl and @grave
is created so it's not nil. When I test manually candle
is created correctly and it's associated to grave
. Any clues what may cause spec to fail?
Rails 4.2,RSpec 3.x
Rails 4.2, RSpec 3.x
推荐答案
您的路线将如下所示:graves/:grave_id/candles
,因此您必须传递一个 @grave.id
到您的 post
方法作为 grave_id
.
Your route will look like this: graves/:grave_id/candles
, so you have to pass a @grave.id
to your post
method as grave_id
.
post :create, grave_id: @grave.id, candle: { name: "Dummy name", body: "Dummy body", grave_id: @grave.id}
这篇关于嵌套资源的 RSpec 控制器,before_action的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!