#ruby-on-rails #ruby-on-rails-3 #mongoid #rspec2
#ruby-on-rails #ruby-on-rails-3 #монгоидный #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>
Я пробовал несколько разных вещей, но независимо от того, что я пытаюсь, я, похоже, не могу получить правильный идентификатор объекта в своем тесте.
Ответ №1:
Если вы заглушаете :id=
, вы создаете очень слабый тест. На самом деле, если вы не уверены во внутренних компонентах Mongoid, скорее всего, ваши тесты будут прерваны, если Mongoid изменит способ генерации идентификатора. И на самом деле, это не работает.
Кроме того, имейте в виду, что вы создаете 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
Комментарии:
1. Спасибо! Я новичок в rspec и, кажется, все время забываю о назначениях.