【问题标题】:RSpec controller for nested resources, before_action用于嵌套资源的 RSpec 控制器,before_action
【发布时间】:2016-09-20 19:27:35
【问题描述】:

假设我有这样的设置:

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 创建蜡烛 失败/错误:expect(response).to redirect_to(@grave) 预期响应为 ,但为

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

Rails 4.2,RSpec 3.x

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec3


    【解决方案1】:

    您的路线将如下所示: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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多