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.