【问题标题】:transient attribute in Factory Bot not workingFactory Bot 中的瞬态属性不起作用
【发布时间】:2020-08-15 06:26:03
【问题描述】:

我的这个对象包含一个默认值为 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 在 ruby​​ 测试文件中有一个长度为 800 的单词。

但是,我正在测试的类显示 object.word 的单词长度为 101。 就好像它忘记了我设置的一样。

发生了什么事? .

编辑:在我的课堂上,我使用 SQL 查询对象。这会影响对象吗?

【问题讨论】:

  • 您可以编辑您的帖子以包含您正在测试的课程中的代码吗?看起来答案就在那个代码中,但我们看不到它。
  • @anu 你能仔细检查一下你实际上是在为你正在测试的对象设置宽度吗?也许您错误地将其设置为另一个对象?
  • 如果您使用 SQL 查询对象,它如何使用工厂?能否请您提供更多信息。

标签: ruby factory-bot transient


【解决方案1】:

您的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2021-12-11
    • 2012-02-25
    • 2011-07-20
    相关资源
    最近更新 更多