如何取消设置 FactoryBot 特征中的 属性?

How to unset a property in a FactoryBot trait?

在我的模型中,我有一个具有默认值的 属性 foo

我想编写与 foo 默认值相关的测试,但我的 FactoryBot 将其设置为 nil(并覆盖默认值)。

如果我从工厂机器人中删除 foo 它会破坏一些其他测试。所以我想使用类似 trait 的东西来创建 foo 不是网络的情况,但我没有找到任何方法来取消 属性.

有什么方法可以取消 FactoryBot 中的 属性 设置吗?

FactoryBot.define do
  factory :my_model do
    foo { 'abc' }
    bar { 'abc' }

    trait(:foo_not_set) do
      # magic to unset foo
    end
  end
end

您可以使用瞬态块来使用虚拟属性:

FactoryBot.define do
  factory :my_model do
    bar { 'abc' }

    transient do
      default_values true
    end

    before(:create) do |my_model, evaluator|
      if evaluator.default_values?
        foo { 'abc' }
      end
    end

    trait(:foo_not_set) do
      transient do
        default_values { false }
      end
    end
  end
end

当工厂 class 只是一个散列时,使用瞬态值对我不起作用,即当我只想要一个完全没有该键的散列时,特征将是 nil。对我来说最有效的方法是使用嵌套工厂并将您可能称为“默认”工厂的东西设置为嵌套工厂......一种稍微倒退的方法但工作原理相同:

FactoryBot.define do
  factory :my_hash_without_foo do
    bar { 'abc' }

    factory :my_hash do
      foo { 'abc' }
    end
  end
end