使用factory_boy和randint

时间:2019-03-20 22:56:20

标签: python-2.7 faker django-1.11 factory-boy

使用randint和factory_boy时会生成重复值。检查每个对象的资产时,我的测试失败。在工厂调用create()时,两者之间的条形码也相同。

在创建每个对象之前,我是否需要提供其他种子?

包装

  • 工厂男孩2.11.1
  • Faker 1.0.4
  • python 2.7
  • django 1.11

文件

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

答案 0 :(得分:1)

Python语言的设计方式使您的代码无法正常工作。

它严格等同于以下内容:

asset

您已为barcodeclass 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') 固定了一个随机值,因此通过该工厂生成的每个对象都将具有完全相同的值。

正确的方法是使用各种内置声明:

var input = document.getElementById('input');
var output = document.getElementById('output');
input.addEventListener('input', function() {
  output.value = input.value;
});