繁体   English   中英

在 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'

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)

更多关于它在这里

UPD正如我所说,这个解决方案是次优的:

  • factory.Faker._DEFAULT_LOCALE是私有字段
  • fake()faker()使用私有接口
  • fake()不起作用,因为factory-boy==3.1.0
  • 如果我要使用faker ,我会直接使用它,而不是通过factory-boy

您通常应该更喜欢其他答案 留给后人这一块。


不是一个好的解决方案,但现在它已经足够好了。 您可以更改保存该值的变量

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的 faker 的简单方法:

from app.faker import fake
print(fake('random_int'))
print(faker().random_int())

我和你有同样的问题。 对于临时解决方案,请尝试在 factory.Faker 中传递语言环境。

例如:

name = factory.Faker('first_name', locale='es_ES')

使用 Django,您可以简单地在<myproject>/settings.py插入以下几行:

import factory
factory.Faker._DEFAULT_LOCALE = 'fr_FR'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM