嵌套资源的 RSpec 控制器,before_action [英] RSpec controller for nested resources, before_action

查看:43
本文介绍了嵌套资源的 RSpec 控制器,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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆