1

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

ответ

2

Я не знаю, если это то, что вы ищете, но если вы первый вам создать сообщение может получить отправителя через это и назначить его @me.

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

Это вообще помогает?

+0

Я не думал об этом, спасибо. Я вижу это как красивую стенографию для других ситуаций, но, например. здесь мы используем драгоценный камень «Очищение». @me стремится к раннему установлению и повторному использованию в связке объектов, поэтому форма '@my_message = Factory (: message,: sender => @ me)' будет короче и понятнее. –

+0

Вопрос в том, что делает текущий пользователь отличным от любого другого пользователя? Это просто факт, что он назначен переменной @me? Это выходит за рамки завода и вводит неясную зависимость. – ryanb

+1

Вы правы. При отражении твердое кодирование @me (или аналогичное) на фабрике является немым. Фабрика должна принять параметр, который он, конечно же, делает в целом как конечный хеш в форме 'Factory (: message,: sender => @ me)'. Это, казалось бы, возвращает его к абстрагированию помощника типа 'create_message_owned_by (@me)', чтобы обернуть определенные настройки повторной ассоциации. –

1

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

См. Также this question и this thread из списка рассылки factory_girl.

Смежные вопросы