문제

누구든지 공장이 협회에 미리 구축 된 모델 인스턴스를 사용하도록하는 더 좋은 방법을 제안 할 수 있습니까? 예를 들어, 메시지 공장의 자녀를 정의하여Factory(:my_message) 대체 할 수 있습니다Factory(:message,:sender=>@me) ?

때로는 설정 해시 가이 만난 예제보다 더 관여하거나 많은 테스트에서 반복되어 공장으로 밀어 붙이는 것이 더 나을 것 같습니다.

내가 생각할 수있는 한 가지 대안은 다음과 같은 테스트 도우미 방법을 정의하는 것입니다. create_message_owned_by(@me), 그러나 나는 factory_girl 자체 내에 방법이 있기를 바라고 있습니다.

Factory_girl 공장 :

Factory.define :sender do |s|
  sender.name "Dummy name"
end

Factory.define :message do |msg|
  msg.text "Dummy text"
  msg.association :sender
end

Factory.define :my_message, :parent=>:message do |msg|
  msg.text "Dummy text"
  ### ? what goes here for msg.association :sender ? ###
end

MessagesControllerTest 발췌문 (whita 사용) :

context "on GET /messages" do
  setup do
    @me = Factory(:sender)
    @my_message = Factory(:message,:sender=>@me)
    @somebody_elses_message = Factory(:message)
    sign_in_as(@me)
    get :index
  end
  should "only assign my messages" do
    assert_contains(assigns(:messages), @my_message)
    assert_does_not_contain(assigns(:messages), @somebody_elses_message)
  end
end
도움이 되었습니까?

해결책

이것이 당신이 찾고있는 것인지 모르겠지만, 처음 메시지를 만들면 발신자를 가져 와서 다음과 같이 할당 할 수 있습니다. @me.

@my_message = Factory(:message)
@me = @my_message.sender

그것이 전혀 도움이됩니까?

다른 팁

1 분 동안 분명하지 않은 종속성을 만드는 문제를 무시하면 위의 예제는 FactoryGirl 1.2.3의 새로운 콜백으로 처리 될 수 있습니다. 지금 있습니다 after_build 그리고 after_create 콜백, 데이터베이스에 이미 존재 한 후 생성 된 객체에서 작업을 수행 할 수 있도록 (그리고 ID를 가져올 ID 등).

또한보십시오 이 질문 그리고 이 스레드 factory_girl 메일 링리스트에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top