pythondjangofactory-boy

Change default faker locale in factory_boy


How can I set the default locale in Python's factory_boy for all of my Factories?

In docs says that one should set it with factory.Faker.override_default_locale but that does nothing to my fakers...

import factory
from app.models import Example
from custom_fakers import CustomFakers

# I use custom fakers, this indeed are added
factory.Faker.add_provider(CustomFakers)
# But not default locales
factory.Faker.override_default_locale('es_ES')

class ExampleFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Example

    name = factory.Faker('first_name')


>>> from example import ExampleFactory
>>> e1 = ExampleFactory()
>>> e1.name
>>> u'Chad'

Solution

  • The Faker.override_default_locale() is a context manager, although it's not very clear from the docs.

    As such, to change the default locale for a part of a test:

    with factory.Faker.override_default_locale('es_ES'):
        ExampleFactory()
    

    For the whole test:

    @factory.Faker.override_default_locale('es_ES')
    def test_foo(self):
        user = ExampleFactory()
    

    For all the tests (Django):

    # settings.py
    TEST_RUNNER = 'myproject.testing.MyTestRunner'
    
    # myproject/testing.py
    import factory
    from django.conf import settings
    from django.util import translation
    import django.test.runner
    
    class MyTestRunner(django.test.runner.DiscoverRunner):
        def run_tests(self, test_labels, extra_tests=None, **kwargs):
            with factory.Faker.override_default_locale(translation.to_locale(settings.LANGUAGE_CODE)):
                return super().run_tests(test_labels, extra_tests=extra_tests, **kwargs)
    

    More on it here.