2017-09-27 2 views
0

1) J'ai ce modèle d'emploi et l'institution modèleComment faire l'intégration de test créer par le biais d'autres modèle

class Job < ApplicationRecord 
    belongs_to :institution 
    # others attibutes 
end 

2) Ceci est mon action créer sur JobsController - je besoin d'une institution pour créer un emploi. c'est bon.

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

3) C'est le test d'intégration que j'ai créé je ne reçois pas le test de la réussite

Dans 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) Et ceci est mon erreur de la console

#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 

Répondre

1

Commencez par l'imbrication de la ressource jobs correctement:

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

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

Ce sera donner à ces routes:

   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 
... 

Notez que :institution_id est un fait maintenant partie de modèle URI pour la création de route, et il sera disponible en params[:institution_id].

Dans votre test que vous souhaitez POST à ​​/institutions/:institution_id/jobs:

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 

En outre, vous voulez vérifier que le travail a été effectivement créé pour l'institution à droite. Nous faisons cela en passant le lambda ->{ @institution.jobs.count }.

Et que les utilisateurs sont redirigés vers la ressource correcte - pas seulement quelque part - ce qui est fait avec assert_redirected_to @institution.jobs.last.

+0

Merci beaucoup. Cela a fonctionné pour moi. Vos conseils sur la façon de mettre le bon chemin et comment créer le travail pour la bonne institution m'a aidé à comprendre. –

0

Il ressemble que lorsque vous appelez à la ligne 22

get new_institution_job_path(@institution) 

l'objet @institution vous avez construit dans le bloc setup est pas enregistré dans la base de données.

L'erreur que vous recevez, ActiveRecord::RecordNotFound, indique qu'il ne peut pas être trouvé une institution avec l'ID nil.

Vous pouvez facilement vérifier si je suis devinant en ajoutant cette affirmation:

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 

Assurez-vous que votre méthode institutions(:standard) ressemble Institution.create!() et non pas comme Institution.new ou Institution.build

+1

Etes-vous sûr de ça? 'institutions (: standard)' semble accéder à [un appareil] (http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures). Ils sont créés dans la base de données avant chaque exécution de test. – max

+0

Je ne suis pas sûr à 100% car ma suite de tests est généralement 'rspec' et j'utilise' factory_girl' pour les appareils. Cependant, le message d'erreur que l'OP obtient est RecordNotFound, donc je suppose que pendant le test, il ne peut pas trouver un enregistrement avec nil id (selon le retraçage).Je suis d'accord que '@ institution' est une instance ActiveRecord, mais je suppose qu'elle n'est pas enregistrée dans la base de données. Peut-être que ça vaut la peine d'essayer '@ institution.save! 'Dans le bloc d'installation – mabe02

+1

En fait, les lignes' get new_institution_job_path (@institution); assert_response: le succès 'passent qui devrait signifier que l'enregistrement est persistant. Mais c'est difficile à dire puisque tout le monde écrit des tests d'intégration en minitest comme un fou furieux. – max