如何在 FactoryBot 的 trait 中取消设置一个属性?

3
在我的模型中,我有一个属性foo,它有一个默认值。
我想编写一个关于 foo 默认值的测试,但是我的 FactoryBot 将其设置为 nil (并覆盖了默认值)。
如果我从工厂机器人中删除 foo,那么会破坏一些其他测试。因此,我想使用类似于trait的东西来创建一个 foo 不为 net 的情况,但我没有找到任何取消设置该属性的方法。
是否有办法在 FactoryBot 中取消设置属性?
FactoryBot.define do
  factory :my_model do
    foo { 'abc' }
    bar { 'abc' }

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

那么在默认情况下,您希望将其设置为默认值,在特性中则为nil? - mrzasa
默认情况下,相反的是nil,特质的默认值是default。 (我知道这很混乱,但默认规则是新东西) - Alan Alves de Oliveira
1
好的,这是一个棘手的情况 :) - mrzasa
我想避免重构测试,但如果没有其他办法... 那就开始吧! - Alan Alves de Oliveira
创建一个没有foo的工厂,并创建一个带有foo的trait。这样,测试数据就必须被更改,而不是测试用例。 - Akshay Kumar
2个回答

8

你可以使用 transient 块来调整虚拟属性:

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

0

当工厂类只是一个哈希表时,使用瞬态值对我来说并不起作用,即当我只想要一个没有该键的哈希表时,特质将为nil。对我最有效的方法是使用嵌套工厂,并将您可能称之为“默认”工厂设置为嵌套工厂...这是一种略微倒退的方法,但同样有效:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接