Поддельное поле локали для тестирования модели - PullRequest
0 голосов
/ 26 апреля 2019

У меня просто есть коллекция языков в модели, подобной этой:

from django.conf.global_settings import LANGUAGES

class AvailableLanguage(models.Model):
    code = models.CharField(choices=LANGUAGES, unique=True)

В factories.py, я хотел бы подделать поле code.Я попытался получить случайный код локали из LANGUAGES, но это не удалось.Вместо того, чтобы создавать один экземпляр AvailableLanguage, он зацикливается на языках и быстро поднимает проблему, потому что для code установлено значение unique.

Так что я подумал о создании провайдера как одиночного, и он потерпел неудачупо той же причине.Он генерирует все коды локали вместо предоставления только одного!


class Provider(BaseProvider):

    lang_code = NotImplemented

    def __init__(self, generator):
        self.langs = LANGUAGES
        self.generator = generator

    def __getattribute__(self, attrib):
        if attrib == 'lang_code':
            self.lang_code = self.langs.pop()[0]
            return self.lang_code
        else:
            return super().__getattribute__(attrib)


fake.add_provider(Provider)


class AvailableLanguageFactory(DjangoModelFactory):

    code = Faker('lang_code')

    class Meta:
        model = AvailableLanguage

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете попробовать использовать Итератор от Factory Boy.

from django.conf.global_settings import LANGUAGES
import factory


class AvailableLanguageFactory(factory.DjangoModelFactory):
    code = factory.Iterator(LANGUAGES, getter=lambda l: l[0])

    class Meta:
        model = AvailableLanguage
...