2017-09-27 4 views
0

1) Ich habe dieses Modell Job und das Modell InstitutionWie Integrationstest schafft durch anderes Modell

class Job < ApplicationRecord 
    belongs_to :institution 
    # others attibutes 
end 

2) Dies ist meine Aktion erstellen, die auf JobsController zu tun - ich brauche eine Institution, einen Job zu erstellen. es ist in Ordnung.

def create 
    build_job 
    save_job || render(:new, status: :unprocessable_entity) 
end 

3) Dies ist der Integrationstest, die ich erstellt Ich bin nicht den Erfolg Test

In params -I also tried institution: @institution -and also tried institution_id: @institution.id

require 'test_helper' 

class JobActionsTest < ActionDispatch::IntegrationTest 
    setup do 
    @user = users(:standard) 
    sign_in @user 
    @institution = institutions(:standard) 
    end 

    test "can create a job through institution" do 
    get new_institution_job_path(@institution) 
    assert_response :success 

    assert_difference('Job.count') do 
     post jobs_path, 
      params: {job: {title: "Desenvolvedor", description: "Ruby", 
          requirements: "rspec and capybara", 
          start_date: Date.today, 
          end_date: Date.today + 5.days, 
          institution: @institution.id}} 
    end 

    assert_response :redirect 
    follow_redirect! 
    assert_response :success 
    end 
end 

4) Und das ist meine Konsole Fehler bekommen

#Running: 
E 

Error: 
JobActionsTest#test_can_create_a_job_through_institution: 
ActiveRecord::RecordNotFound: Couldn't find Institution with 'id'= 
    app/controllers/jobs_controller.rb:74:in `job_scope' 
    app/controllers/jobs_controller.rb:52:in `build_job' 
    app/controllers/jobs_controller.rb:18:in `create' 
    test/integration/job_actions_test.rb:22:in `block (2 levels) in <class:JobActionsTest>' 
    test/integration/job_actions_test.rb:21:in `block in <class:JobActionsTest>' 


bin/rails test test/integration/job_actions_test.rb:17 

Antwort

1

starten durch Verschachtelung der jobs Ressource richtig:

resources :institutions do 
    resources :jobs, only: [:new, :create] 
end 

# or to create the full suite 
resources :institutions do 
    resources :jobs, shallow: true 
end 

Dies wird gibt diese Routen:

   Prefix Verb URI Pattern          Controller#Action 
    institution_jobs POST /institutions/:institution_id/jobs(.:format)  jobs#create 
new_institution_job GET /institutions/:institution_id/jobs/new(.:format) jobs#new 
... 

Beachten Sie, dass :institution_id ein jetzt ein Teil von URI-Muster für die erstellen Route ist, und es wird als params[:institution_id] zur Verfügung.

In Ihrem Test möchten Sie /institutions/:institution_id/jobs POST:

require 'test_helper' 

class JobActionsTest < ActionDispatch::IntegrationTest 
    setup do 
    @user = users(:standard) 
    sign_in @user 
    @institution = institutions(:standard) 
    end 

    # Use separate examples per route/case 
    test "can fill in form to create a new job" do 
    get new_institution_job_path(@institution) 
    assert_response :success 
    end 

    test "can create a job through institution" do 
    assert_difference ->{ @institution.jobs.count } do 
     post institution_jobs_path(@institution), 
      params: { 
      job: { 
       title: "Desenvolvedor", 
       description: "Ruby", 
       requirements: "rspec and capybara", 
       start_date: Date.today, 
       end_date: Date.today + 5.days 
      } 
      } 
    end 
    assert_redirected_to @institution.jobs.last 
    follow_redirect! 
    assert_response :success 
    end 
end 

Weitere Sie, dass der Job testen wollen tatsächlich für die richtige Einrichtung geschaffen. Wir tun das, indem wir die Lambda ->{ @institution.jobs.count } übergeben.

Und dass die Benutzer auf die richtige Ressource umgeleitet werden - nicht nur irgendwo - was mit assert_redirected_to @institution.jobs.last getan wird.

+0

Vielen Dank. Das hat für mich funktioniert. Ihre Tipps, wie man den richtigen Weg einstellt und wie man den Job für die richtige Institution schafft, haben mir geholfen zu verstehen. –

0

Es sieht so aus, dass, wenn Sie in Zeile rufen 22

get new_institution_job_path(@institution) 

das @institution Objekt, das Sie in dem setup Block gebaut haben, ist nicht in der Datenbank gespeichert.

Der Fehler, den Sie erhalten, ActiveRecord::RecordNotFound, besagt, dass es keine Institution mit der ID gefunden werden kann.

Sie können ganz einfach überprüfen, ob ich richtig durch diese Behauptung zu raten bin Zusatz:

test "can create a job through institution" do 
    assert_not_nil(@institution.id) # or assert_not_equal(0, Institution.where(id: @institution.id).size) 
    get new_institution_job_path(@institution) 
    assert_response :success 
    #... 
    end 

Stellen Sie sicher, dass Ihre institutions(:standard) Methode wie Institution.create!() aussieht und nicht wie Institution.new oder Institution.build

+1

Sind Sie sicher? 'institutions (: standard)' sieht so aus, als ob er auf [ein Fixture] zugreift (http://guides.rubyonrails.org/testing.html#the-low-down-on-fixures). Sie werden vor jedem Testlauf im DB angelegt. – max

+0

Ich bin nicht 100% sicher, da meine Testsuite normalerweise 'rspec' ist und ich' factory_girl' für Fixtures verwende. Die Fehlermeldung, die das OP erhält, ist jedoch RecordNotFound, daher nehme ich an, dass er während des Tests keinen Datensatz mit der ID nil (entsprechend dem Traceback) finden kann.Ich stimme zu, dass "@ institution" eine ActiveRecord-Instanz ist, aber ich vermute, dass sie nicht in der Datenbank gespeichert ist. Vielleicht würde es sich lohnen, '@ institution.save!' Im Setup-Block – mabe02

+1

zu versuchen. Tatsächlich haben die Zeilen 'get new_institution_job_path (@institution); assert_response: Erfolg wird bestanden, was bedeutet, dass der Datensatz bestehen bleibt. Aber es ist schwer zu sagen, da jeder im Minitest Integrationstests schreibt wie ein Irrer. – max