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 나는 일하는 협회를 생각해 냈다. , 그러나 나는 특성으로조차 공장에서 그들을 정의하고 싶지 않다. 내가 project.workspace를 호출 할 수 있기 때문에

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

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

이 작동하고, 모두는 유효한 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) } 

RspecRspec

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

를 사용하는 경우 당신은 내가 내가 미안 해요

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

를 생각 같은 것을 할 수 관련된 문제를 설명하지 않았다. factory associations과 함께 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