Проблема с дублирующимися значениями, сгенерированными при использовании factory_boy и randint - PullRequest
0 голосов
/ 21 марта 2019

Я вижу повторяющиеся значения, генерируемые при использовании randint и factory_boy. Мой тест не пройден при проверке актива для каждого объекта. Штрих-код также одинаков между двумя при вызове create () на фабрике.

Нужно ли предоставлять разные начальные значения перед каждым созданием объекта?

Пакеты

  • фабрикант 2.11.1
  • Faker 1.0.4
  • питон 2,7
  • Джанго 1,11

Файлы

Семя / factories.py

import factory
from A1.models import *
from random import randint, random
faker = Factory.create()

class AssetFactory(factory.DjangoModelFactory):

    class Meta:
        model = Asset

asset = "ABC" + str(randint(0000, 9999))
barcode = "AA" + randint(111111, 999999)
user = factory.lazy_attribute(lambda x: faker.name())

tests.py

def test_randomCreation(self):
    new_asset = AssetFactory.create()
    new_asset2 = AssetFactory.create()
    self.assertNotEqual(new_asset.asset, new_asset2.asset)  #FAILS

A1 / models.py

class Asset(models.Model):
    asset =  models.CharField(max_length=255, verbose_name="Asset")
    barcode = models.CharField(max_length=255)
    user = models.CharField(max_length=255)

Может кто-нибудь указать мне правильное направление? Заранее спасибо !!

1 Ответ

1 голос
/ 21 марта 2019

При разработке языка Python ваш код не может работать.

Это строго эквивалентно следующему:

_RANDOM_ASSET = "ABC" + str(randint(0000, 9999))
_RANDOM_BARCODE = "AA" + str(randint(111111, 999999))

class AssetFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.Asset
    asset = _RANDOM_ASSET
    barcode = _RANDOM_BARCODE
    user = factory.LazyAttribute(lambda x: faker.name())

Вы зафиксировали случайное значение для asset и barcode, поэтому каждый объект, сгенерированный в этой фабрике, будет иметь одинаковое значение.

Правильным способом было бы использовать различные встроенные объявления:

class AssetFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.Asset

    asset = factory.fuzzy.FuzzyText(length=4, prefix='ABC', chars=string.digits)
    barcode = factory.fuzzy.FuzzyText(length=6, prefix='AA', chars=string.digits)
    user = factory.Faker('name')
...