2012-10-24 3 views
5

Próbuję przetestować powiązania w moich testach kontrolera Rspec. Problem polega na tym, że Factory nie tworzy asocjacji dla polecenia attributes_for. Tak więc, zgodnie z sugestią w this post I zdefiniowane atrybuty mój validate w moim kontrolera specyfikacji tak:FactoryGirl attributes_for and association

def valid_attributes 
    user = FactoryGirl.create(:user) 
    country = FactoryGirl.create(:country) 
    valid_attributes = FactoryGirl.build(:entitlement, user_id: user.id, country_id: country.id, client: true).attributes.symbolize_keys 
    puts valid_attributes 
end 

Jednak gdy Próby kontroler wciąż otrzymuję następujące błędy:

EntitlementsController PUT update with valid params assigns the requested entitlement as @entitlement 
    Failure/Error: entitlement = Entitlement.create! valid_attributes 
    ActiveRecord::RecordInvalid: 
    Validation failed: User can't be blank, Country can't be blank, Client & expert are both FALSE. Please specify either a client or expert relationship, not both 

Jeszcze The wyjście valid_attributes w terminalu wyraźnie pokazuje, że każdy valid_attribute ma user_id, country_id i ekspert jest ustawiona na wartość true:

{:id=>nil, :user_id=>2, :country_id=>1, :client=>true, :expert=>false, :created_at=>nil, :updated_at=>nil} 

Odpowiedz

4

wygląda na to, że masz puts jako ostatnia linia w twojej metodzie valid_attributes, która zwraca zero. Dlatego kiedy przekazać go do Entitlement.create! pojawi się błąd o użytkownika i kraj jest puste, itp

Spróbuj usunąć że puts linia, więc trzeba po prostu:

def valid_attributes 
    user = FactoryGirl.create(:user) 
    country = FactoryGirl.create(:country) 
    FactoryGirl.build(:entitlement, user_id: user.id, country_id: country.id, client: true).attributes.symbolize_keys 
end 

Nawiasem mówiąc, to naprawdę nie powinno tworząc użytkowników i kraje, a następnie przekazując ich identyfikatory do build, możesz to zrobić w samej fabryce, włączając linie z user i country w fabryce entitlement. Po uruchomieniu FactoryGirl.build(:entitlement) zostanie on automatycznie utworzony (ale w rzeczywistości nie zapisze rekordu entitlement).

+0

Ach dzięki - pracowali nad tym zbyt długo tej nocy! –

Powiązane problemy