Вопрос

Кто-нибудь может предложить лучший способ заставить фабрику использовать предварительно созданную модель экземпляр для ее ассоциации?Например, чтобы было возможно ниже определить дочерний элемент фабрики сообщений, чтобы вызов 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 (с использованием shoulda):

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

Помогает ли это вообще?

Другие советы

Игнорируя на минуту проблему создания неясной зависимости, приведенный выше пример можно было бы обработать с помощью новых обратных вызовов в FactoryGirl 1.2.3.Теперь есть after_build и after_create обратные вызовы, чтобы вы могли выполнять операции с созданными объектами после того, как они уже существуют в базе данных (и у них есть идентификатор, за который можно ухватиться, и т.д.).

Смотрите также этот вопрос и этот поток из списка рассылки factory_girl.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top