2017-10-10 5 views
0

J'ai un modèle person qui est la base pour tous les types d'utilisateurs dans mon application Rails 4. J'ai un modèle administrator, un modèle worker, un modèle client qui accepte tous les attributs imbriqués. Voici mon administrator modèleComment configurer les tests unitaires pour un contrôleur avec attributs imbriqués dans Rails avec Minitest

class Administrator < ActiveRecord::Base 
    belongs_to :person 
    accepts_nested_attributes_for :person 

    ... other model code here 
end 

Dans ma base de données SQLite J'ai une contrainte qui dit person_id ne peut pas être nulle.

Le test de contrôleur pour le administrator échoue avec le message »

ActiveRecord::StatementInvalid: SQLite3::ConstraintException: NOT NULL 
constraint failed: administrators.person_id: INSERT INTO "administrators" 
("created_at", "updated_at") VALUES (?, ?) 

administrators_controller_test.rb contient les éléments suivants,

setup do 
    @administrator = administrators(:administrator_montgomery_burns) 
    @person = people(:person_montgomery_burns) 
end 

test "should create administrator" do 
    assert_difference('Administrator.count') do 
    post :create, 
     administrator: { 
     person_id: @administrator.person_id 
     } 
    end 
    assert_redirected_to administrator_path(assigns(:administrator)) 
end 

J'ai aussi essayé,

test "should create administrator" do 
    assert_difference('Administrator.count') do 
    post :create, 
     administrator: { 
     person: { 
      first_name: @person.first_name, 
      ... all other person attributes 
     } 
     } 
    end 

    assert_redirected_to administrator_path(assigns(:administrator)) 
end 

Toutes les idées comment cela devrait-il être fait?

Répondre

0

Je l'ai résolu. J'ai regardé le fichier journal params dans le contrôleur en mode de développement, (où il fonctionne), et en mode test, (où il ne l'est pas). Au lieu de

test "should create administrator" do 
    assert_difference('Administrator.count') do 
    post :create, 
     administrator: { 
     person: { 
      first_name: @person.first_name, 
      ... all other person attributes 
     } 
     } 
    end 

    assert_redirected_to administrator_path(assigns(:administrator)) 
end 

utilisation

test "should create administrator" do 
    assert_difference('Administrator.count') do 
    post :create, 
     administrator: { 
     person_attributes: { 
      first_name: @person.first_name, 
      ... all other person attributes 
     } 
     } 
    end 

    assert_redirected_to administrator_path(assigns(:administrator)) 
end 

il suffit de changer person:-person_attributes:.