временный атрибут в Factory Bot не работает - PullRequest
1 голос
/ 30 апреля 2020

У меня есть этот объект, который содержит слово, значение по умолчанию которого равно 101.

 trait :word do
      transient do
        width 101
      end

      after(:create) do |object, evaluator|
        word_x = "x" * evaluator.width
        object.word = word_x
      end
    end

Я звоню

create :object :word, width: 800

, и это прекрасно, что object.word имеет слово длины 800 в тестовом файле ruby.

Однако класс, который я тестирую, показывает, что object.word имеет слово длины 101. Как будто оно забывает, что я его установил.

Что происходит? ,

РЕДАКТИРОВАТЬ: в моем классе я запрашиваю объекты, используя SQL. Будет ли это влиять на объект?

1 Ответ

1 голос
/ 01 мая 2020

Ваша after(:create) функция изменяет объект, но не сохраняет изменения. Если вы затем запросите этот объект из базы данных, у него не будет изменений.

obj = create(:object, :word, width: 800)
p obj.word # 800 long
p obj.changed? # true

# Re-fetch it from the database.
obj.reload
p obj.word # 101 long

Более надежно сделать это как часть атрибута word.

factory :object do
  transient do
    word_width { 11 }
  end

  word { "x" * word_width }
end
...