所以,我一直在打击这个问题一段时间,但是无法取得任何进展。
我有以下控制器操作:
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。
答案 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