Rails тестване на не-AR модел (клас) с FactoryGirl

Имам клас, който изглежда така:

class Killmail::Parser
  def initialize(body)
    @body = body
  end
end

Имам и фабрика за него:

FactoryGirl.define do
  factory :parser, class: Killmail::Parser do
    skip_create

    body '2013.12.02 19:24 bla bla'

    initialize_with { new(attributes) }
  end
end

Всичко работи добре, стига да не се опитвам да променя атрибутите по подразбиране. Въпреки това, когато се опитам да го използвам по този начин

FactoryGirl.create(:parser, body: 'some different body')

Връща това:

=> #<Killmail::Parser:0x007fb2ff116548 @body={:body=>"some different body"}>

какво правя грешно Наистина не мога да намеря в Google нищо полезно по този случай.


person roflomglol    schedule 14.05.2015    source източник
comment
stackoverflow.com/questions/24343730/   -  person Pardeep Dhingra    schedule 14.05.2015


Отговори (2)


Опитахте ли да се обадите на new(body) вместо на new(attributes)? Проблемът може да се крие в това как инициализирате вашия клас Parser.

attributes създава хеш на всички атрибути и пропуски, които...

initialize_with { new(attributes) }
# roughly translates to
Parser.new({ body: '2013.12.02 19:24 bla bla' })

Докато извикването на #new само с body предава само тази стойност като първи параметър...

initialize_with { new(body) }
# roughly translates to
Parser.new('2013.12.02 19:24 bla bla')

И можете да добавите колкото искате стойности към #new по същия начин...

# in your FactoryGirl.define
new_var_1 'new_string_1'
new_var_2 2

initialize_with { new(body, new_var_1, new_var_2) }
# roughly translates to
Parser.new('2013.12.02 19:24 bla bla', 'new_string_1', 2)
person nevets138    schedule 14.05.2015
comment
Благодаря, предполагам, че така трябва да постъпя! Отговорът „ново(атрибути[:тяло])“ беше близък, но сега знам, че мога просто „ново(тяло, и, всяко, нещо, друго)“ - person roflomglol; 14.05.2015
comment
Мда! Добавено към отговора, че можете да третирате #new точно както бихте направили с действителния инициализатор на класа, а #attributes е само помощен метод на FactoryGirl за получаване на хеш на всички стойности, които сте задали в дефиницията. - person nevets138; 14.05.2015

Това ще свърши работа, въпреки че е малко объркващо:

промяна

initialize_with { new(attributes) }

To

initialize_with { new(attributes[:body]) }

Не мисля, че фабричното момиче е създадено за подобни неща TBH

person Doydle    schedule 14.05.2015
comment
Е, това помага, но какво ще стане, ако добавя още атрибути, няма да работи. :‹ - person roflomglol; 14.05.2015