2016-10-24 1 views
2

Je souhaite pouvoir créer des associations avec ID uniquement dans chaque test spécifique, en essayant d'éviter de les définir en usine. J'ai suivi Rails 4 Test PrescriptionsCréer des associations dans test en utilisant Factory_girl

Avoid defining associations automatically in factory_girl definitions. Set them test by test, as needed. You’ll wind up with more manageable test data.

class Workspace < ActiveRecord::Base 
    has_many :projects 
end 
class Project < ActiveRecord::Base 
    belongs_to :workspace 
end 

Ce que je veux

test "" do 
project_with_id = build_stubbed(:project) 
workspace_with_id = build_stubbed(:workspace) 
workspace_with_id.projects.push(project_with_id) 
end 

J'utilise build_stubbed pour créer de valides d'identité, ce qui donne l'erreur suivante:

*** RuntimeError Exception: stubbed models are not allowed to access the database - Project#save({:validate=>true})

Donc, en lisant les documentation fille de l'usine, je suis venu avec des associations de travail , mais je ne veux pas les définir en usine, pas même avec des traits.

FactoryGirl.define do 
    factory :project do 
    association :workspace, strategy: :build_stubbed 
    end 
end 

test "" do 
project = build_stubbed(:project) 
end 

Cela fonctionne parce que je peux appeler project.workspace, et les deux ont une carte d'identité valide

Comment puis-je créer des associations valides (avec ID), mais sans toucher à la base de données, en utilisant uniquement girl Factory créer des objets indépendants?

+0

vous utilisez rspec? –

+0

question est étiqueté avec minitest donc c'est assez sûr de supposer non – max

Répondre

0

Vous pourriez faire quelque chose comme ça si vous utilisez Rspec

let!(:user1) { FactoryGirl.create(:user) } 
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user_id: user1.id) } 

aussi dans Rspec

let!(:user1) { FactoryGirl.create(:user) } 
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user: user1) } 

Dans minitest/test_unit Je crois

user1 = FactoryGirl.create(:user) 
user_social_profile1 = FactoryGirl.create(:user_social_profile, user_id: user1.id) 

Je suis désolé n'a pas expliqué les problèmes associés à L'utilisation de build_stubbed avec les associations d'usine, this réponse fait un très bon travail à expliquer cela.

+0

'create' est de loin pas la même chose que' build_stubbed'. –

+0

Bonjour phil merci pour le downvote, personne ne fait cet argument.Mais il y a plusieurs problèmes qui surviennent lors de l'utilisation de build_stubbed dans ce scénario, c'est pourquoi j'ai proposé une alternative à l'utiliser (ça marche). –

0

build_stubbed initialise un enregistrement et simule la persistance. Donc, ce que vous obtenez est un enregistrement qui répond vrai à persisted? et a un faux ID.

Son très utile, mais l'approche ne fonctionne pas quand il s'agit d'associations que vous auriez besoin de remplacer de grandes parties d'ActiveRecord.

Au lieu de cela que vous souhaitez utiliser create:

before do 
    @project = create(:project) 
    @workshop = create(:workshop, project: @project) 
end 
0

Pour autant que je comprends, vous n'avez pas besoin inverse de travailler, par exemple vous seriez satisfait avec workspace.projects être vide, pas vous? Cela devrait fonctionner pour vous, alors:

workspace = build_stubbed(:workspace) 
project = build_stubbed(:project, workspace: workspace) 

Si vous avez besoin workspace.projects, vous pouvez utiliser ceci:

project = build_stubbed(:project) 
workspace = build_stubbed(:workspace, projects: [project]) 
project.workspace = workspace