Mongoid和RSpec的ID问题

时间:2011-10-24 15:43:07

标签: ruby-on-rails ruby-on-rails-3 mongoid rspec2

所以,我一直在打击这个问题一段时间,但是无法取得任何进展。

我有以下控制器操作:

def create
  @job = Job.new(params[:job])

  respond_to do |format|
    if @job.save
      flash[:notice] = "The Job is ready to be configured"
      format.html { redirect_to setup_job_path(@job.id) }
      format.json { head :ok }
    else
      format.html { redirect_to new_job_path, notice: 'There was an error creating the job.' }
      format.json { render json: @job.errors, status: :unprocessable_entity }
    end
  end
end

我正在尝试测试此操作。这是我对成功创作的重定向的测试。

it "redirects to the Job setup" do
    job.stub(:id=).with(BSON::ObjectId.new).and_return(job)
    job.stub(:save)
    post :create
    response.should redirect_to(setup_job_path(job.id))
end

这里为整个套件定义了工作:

let (:job) { mock_model(Job).as_null_object }

我一直收到以下错误:

2) JobsController POST create when the job saves successfully redirects to the Job setup
 Failure/Error: response.should redirect_to(setup_job_path(job.id))
   Expected response to be a redirect to <http://test.host/jobs/1005/setup> but was a redirect to <http://test.host/jobs/4ea58505d7beba436f000006/setup>

我尝试了一些不同的东西,但无论我尝试什么,我都无法在测试中获得正确的对象ID。

1 个答案:

答案 0 :(得分:1)

如果您存根:id=,那么您正在创建一个非常弱的测试。事实上,除非你对Mongoid内部结构非常有信心,否则如果Mongoid改变它生成id的方式,你的测试可能会破坏。事实上,它不起作用。

另外,请记住,您创建了一个job变量,但是您没有在控制器中传递此变量。这意味着,:create操作将在

初始化自己的作业实例
@job = Job.new(params[:job])

它将完全忽略您的job

我建议您使用assigns

it "redirects to the Job setup" do
  post :create
  response.should redirect_to(setup_job_path(assigns(:job)))
end
相关问题