diff --git a/README.md b/README.md index 85eb73a5dd..05b8f7bbad 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,15 @@ Prefix your method call with `unique`. For example: Faker::Name.unique.name # This will return a unique name every time it is called ``` +If too many unique values are requested from a generator that has a limited +number of potential values, a `Faker::UniqueGenerator::RetryLimitExceeded` +exception may be raised. It is possible to clear the record of unique values +that have been returned, for example between tests. +```ruby +Faker::Name.unique.clear # Clears used values for Faker::Name +Faker::UniqueGenerator.clear # Clears used values for all generators +``` + ## Customization Since you may want to make addresses and other types of data look different diff --git a/lib/helpers/unique_generator.rb b/lib/helpers/unique_generator.rb index d72a175595..cec47be4fc 100644 --- a/lib/helpers/unique_generator.rb +++ b/lib/helpers/unique_generator.rb @@ -20,5 +20,13 @@ def method_missing(name, *arguments) end RetryLimitExceeded = Class.new(StandardError) + + def clear + @previous_results.clear + end + + def self.clear + ObjectSpace.each_object(self, &:clear) + end end end diff --git a/test/test_faker_unique_generator.rb b/test/test_faker_unique_generator.rb index add0af10e7..5409f2f3a7 100644 --- a/test/test_faker_unique_generator.rb +++ b/test/test_faker_unique_generator.rb @@ -24,4 +24,30 @@ def stubbed_generator.test end end + def test_clears_unique_values + stubbed_generator = Object.new + def stubbed_generator.test + 1 + end + + generator = Faker::UniqueGenerator.new(stubbed_generator, 3) + + assert_equal(1, generator.test) + + assert_raises Faker::UniqueGenerator::RetryLimitExceeded do + generator.test + end + + Faker::UniqueGenerator.clear + + assert_equal(1, generator.test) + + assert_raises Faker::UniqueGenerator::RetryLimitExceeded do + generator.test + end + + generator.clear + + assert_equal(1, generator.test) + end end