2016-10-24 7 views
2

それぞれの特定のテストでのみIDとの関連付けを作成し、工場で定義しないようにしたいと考えています。Factory_girlを使用してテスト中の関連付けを構築する

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

: 私は Rails 4 Test Prescriptions

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 

をこれは私が、私は次のエラーを与える、有効なIDを作成するために、build_stubbedを使用しています

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

を望むものを以下に示してきました

だから、工場の女の子を読むdocumentation私は働いていた組合を考え出したしかし、私は工場でそれらを定義したくはなく、形質でさえも定義したくありません。

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

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

私はproject.workspaceを呼び出すことができますので、これは動作し、両方のは、私は(ID付き)有効な関連付けを作成することができますどのように有効なID

を持っていますが、データベースに触れることなく、のみに工場の女の子を使用して独立したオブジェクトを作成しますか?

+0

あなたはRSpecのを使用している:あなたがworkspace.projectsが必要な場合は

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

は、あなたがこれを使用できますか? –

+0

質問はminitestとタグ付けされているので、いいえ、 – max

答えて

0

あなたはminitest/test_unitで

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

RspecにもRspec

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

を使用している場合は、私は私がI申し訳ありません

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

を信じて、このような何かを行うことができます関連する問題を説明していないファクトリアソシエーションでbuild_stubbedを使用すると、 this答えはそれを説明するのに本当に良い仕事をします。

+0

と仮定するのはかなり安全です。 'create'は' build_stubbed'とはまったく同じものではありません。 –

+0

こんにちは、downvoteに感謝、誰もその議論をしています。しかし、このシナリオでbuild_stubbedを使用するときに発生するいくつかの問題があります。 –

0

build_stubbedは、レコードを初期化し、永続性を偽造します。あなたが得るものは、persisted?に真実で、偽のIDを持っているレコードです。

ActiveRecordの大部分をスタブアウトする必要があるため、このアプローチは、関連性が高まると機能しません。

代わりにあなたがcreateを使用したい:

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

私の知る限り理解し、あなたは、例えば、動作するように逆を必要としませんあなたはworkspace.projectsが空であることに満足していますか? これは、あなたのために働く必要があります。

project = build_stubbed(:project) 
workspace = build_stubbed(:workspace, projects: [project]) 
project.workspace = workspace 
関連する問題