Может ли кто-нибудь предложить лучший способ сделать фабрику использовать предварительно созданную модель экземпляр для его объединения? Например, чтобы можно было определить дочерний элемент фабрики сообщений, чтобы вызов Factory(:my_message)
мог заменить на Factory(:message,:sender=>@me)
?Испытания DRYer с ассоциациями в factory_girl
Иногда хеш настройки более активен, чем в этом надуманном примере , или просто повторяется во многих тестах, что было бы лучше отбросить его на завод.
Один из вариантов, который я могу придумать, состоит в том, чтобы определить метод тестового помощника , такой как create_message_owned_by(@me)
, но я надеюсь, что есть путь в самой фабрике.
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,: sender => @ me)' будет короче и понятнее. –
Вопрос в том, что делает текущий пользователь отличным от любого другого пользователя? Это просто факт, что он назначен переменной @me? Это выходит за рамки завода и вводит неясную зависимость. – ryanb
Вы правы. При отражении твердое кодирование @me (или аналогичное) на фабрике является немым. Фабрика должна принять параметр, который он, конечно же, делает в целом как конечный хеш в форме 'Factory (: message,: sender => @ me)'. Это, казалось бы, возвращает его к абстрагированию помощника типа 'create_message_owned_by (@me)', чтобы обернуть определенные настройки повторной ассоциации. –