在 factory_boy 中更改默认的 faker 语言环境
Change default faker locale in factory_boy
如何在 Python 的 factory_boy 中为我的所有工厂设置默认区域设置?
在文档中说应该用 factory.Faker.override_default_locale
设置它,但这对我的伪造者没有任何作用...
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'
我遇到了和你一样的问题。对于临时解决方案,请尝试在 factory.Faker.
中传递区域设置
例如:
name = factory.Faker('first_name', locale='es_ES')
Faker.override_default_locale()
是一个上下文管理器,尽管文档中不是很清楚。
因此,要更改部分测试的默认语言环境:
with factory.Faker.override_default_locale('es_ES'):
ExampleFactory()
整个测试:
@factory.Faker.override_default_locale('es_ES')
def test_foo(self):
user = ExampleFactory()
对于所有测试 (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)
更多信息 here。
UPD 正如我所说,这个解决方案不是最优的:
factory.Faker._DEFAULT_LOCALE
是私有字段
fake()
和 faker()
使用私有接口
fake()
不起作用,因为 factory-boy==3.1.0
- 如果我要使用
faker
,我会直接使用它,而不是通过 factory-boy
您通常应该更喜欢 。留给子孙后代。
这不是一个好的解决方案,但就目前而言,它已经很好了。您可以更改包含值的 variable:
import factory
factory.Faker._DEFAULT_LOCALE = 'xx_XX'
此外,您可以创建这样的文件(app/faker.py
):
import factory
from faker.providers import BaseProvider
factory.Faker._DEFAULT_LOCALE = 'xx_XX'
def fake(name):
return factory.Faker(name).generate({})
def faker():
return factory.Faker._get_faker()
class MyProvider(BaseProvider):
def category_name(self):
return self.random_element(category_names)
...
factory.Faker.add_provider(MyProvider)
category_names = [...]
然后,一旦您导入文件,语言环境就会改变。此外,您还可以获得供应商和在工厂外使用 factory_boy
的伪造者的简单方法:
from app.faker import fake
print(fake('random_int'))
print(faker().random_int())
使用 Django,您只需在 <myproject>/settings.py
中插入以下行:
import factory
factory.Faker._DEFAULT_LOCALE = 'fr_FR'
如何在 Python 的 factory_boy 中为我的所有工厂设置默认区域设置?
在文档中说应该用 factory.Faker.override_default_locale
设置它,但这对我的伪造者没有任何作用...
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'
我遇到了和你一样的问题。对于临时解决方案,请尝试在 factory.Faker.
中传递区域设置例如:
name = factory.Faker('first_name', locale='es_ES')
Faker.override_default_locale()
是一个上下文管理器,尽管文档中不是很清楚。
因此,要更改部分测试的默认语言环境:
with factory.Faker.override_default_locale('es_ES'):
ExampleFactory()
整个测试:
@factory.Faker.override_default_locale('es_ES')
def test_foo(self):
user = ExampleFactory()
对于所有测试 (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)
更多信息 here。
UPD 正如我所说,这个解决方案不是最优的:
factory.Faker._DEFAULT_LOCALE
是私有字段fake()
和faker()
使用私有接口fake()
不起作用,因为factory-boy==3.1.0
- 如果我要使用
faker
,我会直接使用它,而不是通过factory-boy
您通常应该更喜欢
这不是一个好的解决方案,但就目前而言,它已经很好了。您可以更改包含值的 variable:
import factory
factory.Faker._DEFAULT_LOCALE = 'xx_XX'
此外,您可以创建这样的文件(app/faker.py
):
import factory
from faker.providers import BaseProvider
factory.Faker._DEFAULT_LOCALE = 'xx_XX'
def fake(name):
return factory.Faker(name).generate({})
def faker():
return factory.Faker._get_faker()
class MyProvider(BaseProvider):
def category_name(self):
return self.random_element(category_names)
...
factory.Faker.add_provider(MyProvider)
category_names = [...]
然后,一旦您导入文件,语言环境就会改变。此外,您还可以获得供应商和在工厂外使用 factory_boy
的伪造者的简单方法:
from app.faker import fake
print(fake('random_int'))
print(faker().random_int())
使用 Django,您只需在 <myproject>/settings.py
中插入以下行:
import factory
factory.Faker._DEFAULT_LOCALE = 'fr_FR'