thoughtbot/factory_bot

Expose which keys were overridden by the user

mike-burns opened this issue · 2 comments

The context, as passed to the various hooks, does not tell us whether a key was overridden by the user when building/creating/stubbing the object. This means we can't know whether a value is the default, or intentionally set.

Let's expose this on the context. It could be as simple as a list of keys set by the user.

The list of keys is already exposed in the evaluator using the private undocumented method __override_names__ : https://github.com/thoughtbot/factory_bot/blob/main/lib/factory_bot/evaluator.rb#L50-L52
It would make sense to me to make this method part of the public stable API.

I personnaly use it to "sync" associations' associations like so :

transient do
  school do
    if __override_names__.include?(:exam)
      exam.school
    elsif __override_names__.include?(:student)
      student.school
    else
      association :school
    end
  end
end

exam { association :exam, school: school }
student { association :student, school: school }

So you technically already can use this in the callbacks but it is undocumented and not part of the public API

after(:build) do |instance, evaluator|
  evaluator.__override_names_
end

I've submitted a pull request that will make it easier to check which keys were overridden by the user, and which by the factory: #1695. let me know if this works for you.