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}