Вызов методов из модели FactoryGirl в зависимом атрибуте - PullRequest
6 голосов
/ 05 января 2012

У меня есть модель, похожая на следующую:

class Foo
  attr_accessor :attribute_a  # Really an ActiveRecord attribute
  attr_accessor :attribute_b  # Also an ActiveRecord attribute

  def determine_attribute_b
    self.attribute_b = some_biz_logic(attribute_a)
  end
end

В FactoryGirl 1.3 у меня была фабрика, которая выглядела так:

Factory.define :foo do |foo|
  foo.attribute_a = "some random value"
  foo.attribute_b { |f| f.determine_attribute_b }
end

Это сработало просто отлично. attribute_b был атрибутом, зависящим от блока кода, который передавал реальный экземпляр Foo в переменную f, в комплекте с правильно установленным attribute_a для работы.

Я только что обновился до FactoryGirl 2.3.2, и эта техника больше не работает. Переменная f из эквивалентного кода выше не является экземпляром Foo, а вместо FactoryGirl::Proxy::Create. Похоже, что этот класс способен читать ранее установленные атрибуты (так что пример Зависимые атрибуты в документах все еще работает). Однако он не может вызывать реальные методы из встроенного класса.

Есть ли способ использовать технику из старой версии FactoryGirl? Я хочу иметь возможность определить атрибут и установить его значение, используя результат метода экземпляра встроенного класса.

1 Ответ

4 голосов
/ 16 января 2012

Вы можете использовать обратные вызовы after_create и after_build следующим образом:

FactoryGirl.define do
  factory :foo do
    attribute_a "some random value"
    after_build do |obj|
      obj.attribute_b = obj.determine_attribute_b
    end
  end
end

Имейте в виду этот новый синтаксис FactoryGirl.

...