2016-10-24 1 views
2

Ich möchte in jedem spezifischen Test nur Assoziationen mit ID erstellen, um zu vermeiden, sie in der Fabrik zu definieren. Ich verfolge Rails 4 Test PrescriptionsBuild-in-Test-Assoziationen mit 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 

Dies ist, was ich will

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

I build_stubbed bin mit gültigen IDs zu erstellen, die den folgenden Fehler gibt:

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

Also, lesen Fabrik Mädchen documentation Ich kam mit Arbeitsvereinigungen aber ich will sie nicht in der Fabrik definieren, nicht einmal mit Merkmalen.

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

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

Dies funktioniert, weil ich project.workspace nennen kann, und beide haben eine gültige ID

Wie kann ich gültige Verbände (mit Ausweis), aber ohne die Datenbank zu berühren, nur Factory-Mädchen mit auf unabhängige Objekte erstellen?

+0

sind Sie rspec mit? –

+0

Frage ist mit MiniTest so markiert, dass es ziemlich sicher ist, keine anzunehmen – max

Antwort

0

Sie könnten etwas tun, wenn Sie Rspec

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

auch

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

In Minitest/test_unit in Rspec verwenden ich

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

Es tut mir leid habe die damit verbundenen Probleme nicht erläutert Mit build_stubbed mit Factory Associations, this Antwort macht einen wirklich guten Job bei der Erklärung.

+0

'create' ist bei weitem nicht das gleiche wie' build_stubbed'. –

+0

Hallo phil danke für den Downvote, niemand macht dieses Argument.Es gibt jedoch einige Probleme, die bei der Verwendung von build_stubbed in diesem Szenario auftreten, weshalb ich eine Alternative zur Verwendung von build_stubbed angeboten habe (das funktioniert). –

0

build_stubbed initialisiert eine Aufzeichnung und Fälschungen Persistenz. Also, was Sie bekommen, ist ein Datensatz, der persisted? entspricht und eine gefälschte ID hat.

Es ist sehr nützlich, aber der Ansatz funktioniert nicht, wenn es um Assoziationen geht, da Sie große Teile von ActiveRecord auszugeben müssten.

Stattdessen wollen Sie verwenden create:

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

Soweit ich verstehe, Sie brauchen nicht eine inverse zu arbeiten, z.B. Sie würden mit workspace.projects zufrieden sein, leer zu sein, nicht wahr? Dies sollte dann für Sie arbeiten:

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

Wenn Sie workspace.projects benötigen, können Sie diese verwenden:

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