RSpec 嵌套资源控制器,before_action
RSpec controller for nested resources, before_action
假设我有这样的设置:
config/routes.rb
resources :graves do
resources :candles
end
app/models/grave.rb
has_many :candles, dependent: :destroy
app/models/candles.rb
belongs_to :grave
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
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
。任何可能导致规范失败的线索?
Rails4.2,RSpec3.x
您的路线将如下所示:graves/:grave_id/candles
,因此您必须将 @grave.id
作为 grave_id
.
传递给您的 post
方法
post :create, grave_id: @grave.id, candle: { name: "Dummy name", body: "Dummy body", grave_id: @grave.id}
假设我有这样的设置:
config/routes.rb
resources :graves do
resources :candles
end
app/models/grave.rb
has_many :candles, dependent: :destroy
app/models/candles.rb
belongs_to :grave
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
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
。任何可能导致规范失败的线索?
Rails4.2,RSpec3.x
您的路线将如下所示:graves/:grave_id/candles
,因此您必须将 @grave.id
作为 grave_id
.
post
方法
post :create, grave_id: @grave.id, candle: { name: "Dummy name", body: "Dummy body", grave_id: @grave.id}