Rails тестирует модель (класс) без дополненной реальности с помощью 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"}>

Что я делаю не так? Не могу найти ничего полезного в этом случае.


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]) }

Я не думаю, что фабричная девушка была создана для таких вещей.

person Doydle    schedule 14.05.2015
comment
Ну, это помогает, но что, если я добавлю больше атрибутов, это не сработает. :‹ - person roflomglol; 14.05.2015