2011-10-24 4 views
1

Donc, je me suis battu la tête contre cela pendant un moment et je ne peux pas faire de progrès.Problèmes d'ID avec Mongoid et RSpec

J'ai l'action du contrôleur suivant:

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 

Je suis en train de tester cette action. Voici mon test pour la redirection sur la création réussie.

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 

emploi est défini pour toute la suite ici:

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

Je continue à obtenir l'erreur suivante:

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> 

J'ai essayé quelques choses différentes, mais peu importe ce que je essayez, je n'arrive pas à obtenir l'ID d'objet approprié dans mon test.

Répondre

1

Si vous remplissez le :id=, vous créez un test très faible. En fait, à moins que vous ne soyez très confiant sur les internes de Mongoid, vos tests risquent de se casser si Mongoid change la façon dont il génère l'identifiant. Et en fait, ça ne marche pas. De plus, gardez à l'esprit que vous créez une variable job, mais vous ne transmettez pas cette variable à l'intérieur du contrôleur. Cela signifie, l'action :create initialise sa propre instance de travail à

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

et il va complètement ignorer votre job.

Je vous suggère d'utiliser assigns.

it "redirects to the Job setup" do 
    post :create 
    response.should redirect_to(setup_job_path(assigns(:job))) 
end 
+0

Merci beaucoup! Je suis nouveau à rspec et semble continuer à oublier les affectations. – LeakyBucket

Questions connexes