假冒区域设置字段以进行模型测试

时间:2019-04-26 07:48:46

标签: python django testing faker

在这样的模型中,我只是拥有一组语言:

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 个答案:

答案 0 :(得分:1)

您可以尝试使用Iterator 来自工厂男孩。

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