Тесты сушилки с ассоциациями в factory_girl
-
16-09-2019 - |
Вопрос
Кто-нибудь может предложить лучший способ заставить фабрику использовать предварительно созданную модель
экземпляр для ее ассоциации?Например, чтобы было возможно
ниже определить дочерний элемент фабрики сообщений, чтобы вызов
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.