标签: factory-boy

抑制factory_boy捕获的日志信息?

是否有任何方法可以抑制(即隐藏)测试失败或生成错误时工厂男孩生成的捕获的日志信息块?我在说这个:

SomeError: you encountered an error
----------- >> begin captured loggin << -----------
... DEBUG information
----------- >> end captured loggin << -------------

---------------------------------------------------
Ran 1 test...
Run Code Online (Sandbox Code Playgroud)

通常情况下,这些信息与解决问题无关或不必要,而且我需要向上滚动以查看导致错误的原因.

谢谢.

django factory-boy

9
推荐指数
1
解决办法
1136
查看次数

如何使用Factory Boy和Flask-SQLAlchemy设置依赖工厂?

使用Flask-SQLAlchemy和Foreign Key约束的工厂男孩的正确方法是什么?

请考虑以下Flask SQLAlchemy Model设置:

# coding=utf-8
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

# ------------------------------
#   SQLAlchemy Table Models
# ------------------------------
class User(db.Model):
    """ A SQLAlchemy simple model class who represents a user with a ForeignKey Constraint"""
    __tablename__ = 'UserTable'

    user_pk = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.Unicode(20))
    group_fk = db.Column(db.ForeignKey("GroupTable.group_pk"), nullable=False)


class Group(db.Model):
    """ A SQLAlchemy simple model class who represents a user """
    __tablename__ = 'GroupTable'

    group_pk = …
Run Code Online (Sandbox Code Playgroud)

python flask-sqlalchemy factory-boy

9
推荐指数
2
解决办法
4010
查看次数

工厂男孩随机选择一个字段选项"选择"的字段

当Django模型中的字段具有选项选项时,请参阅Django选项字段选项,它使用包含2个项目的可迭代的迭代来定义允许的值.例如:

楷模

class IceCreamProduct(models.Model):
    PRODUCT_TYPES = (
        (0, 'Soft Ice Cream'),
        (1, 'Hard Ice Cream'),
        (2, 'Light Ice Cream'),
        (3, 'French Ice Cream'),
        (4, 'Italian-style Gelato'),
        (5, 'Frozen Dairy Dessert'),
    )
    type = models.PositiveSmallIntegerField('Type', choices=PRODUCT_TYPES, default=0)
Run Code Online (Sandbox Code Playgroud)

要在Factory Boy中生成随机值以供选择,我将使用factory.fuzzy.FuzzyChoice,但这只选择2个项目的可迭代.它不能采用所选迭代的第一项.例如:

工厂

class IceCreamProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = IceCreamProduct

    type = factory.fuzzy.FuzzyChoice(IceCreamProduct.PRODUCT_TYPES)
Run Code Online (Sandbox Code Playgroud)

错误

TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'
Run Code Online (Sandbox Code Playgroud)

获取元组的第一项是不可能的.例如:

工厂

class IceCreamProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = IceCreamProduct

    type = factory.fuzzy.FuzzyChoice(IceCreamProduct.PRODUCT_TYPES)[0]
Run Code Online (Sandbox Code Playgroud)

错误 …

python django factory django-testing factory-boy

9
推荐指数
4
解决办法
6710
查看次数

FactoryBoy-嵌套工厂/最大深度?

我正在为一个大型Django应用程序编写测试,作为该过程的一部分,我将逐步为Django项目中不同应用程序的所有模型创建工厂。

但是,我在FactoryBoy中遇到了一些令人困惑的行为,在该行为中,似乎似乎SubFactories具有最大深度,超过该深度则不会生成任何实例。

当我尝试运行以下测试时,发生错误:

    def test_subfactories(self):
        """ Verify that the factory is able to initialize """
        user = UserFactory()
        self.assertTrue(user)
        self.assertTrue(user.profile)
        self.assertTrue(user.profile.tenant)

        order = OrderFactory()
        self.assertTrue(order)
        self.assertTrue(order.user.profile.tenant)
Run Code Online (Sandbox Code Playgroud)

最后一行将失败(AssertionError: None is not true),通过调试器运行此测试将显示确实返回order.user.profile.tenant None而不是预期的Tenant实例。

这里涉及很多工厂/模型,但是布局相对简单。

User(django的默认值)和所述Profile模型通过一个OneToOneField,其中(后有些麻烦)由表示连接UserFactoryProfileFactory

@factory.django.mute_signals(post_save)
class ProfileFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = yuza_models.Profile
        django_get_or_create = ('user',)

    user = factory.SubFactory('yuza.factories.UserFactory')
    birth_date = factory.Faker('date_of_birth')
    street = factory.Faker('street_name')
    house_number = factory.Faker('building_number')
    city = factory.Faker('city')
    country = factory.Faker('country')
    avatar_file = factory.django.ImageField(color='blue') …
Run Code Online (Sandbox Code Playgroud)

python django factory-boy

9
推荐指数
1
解决办法
370
查看次数

factory_boy中的一对多关系

我使用SQLalchemy作为我的ORM,并试图将我的测试夹具移植到factory_boy.我的架构包括一对多关系中的两个对象.即一个模型的实例具有类似于具有另一个模型的结构的列表.例:

class Person(...):
  id = Column(Integer, primary_key=True)
  name = Column(Text)
  [...]

class Address(...):
  id = Column(Integer, primary_key=True)
  city = Column(Text)
  [...]
  person_id = Column(Integer, ForeignKey('person.id'))
  person = relationship("Person", backref="addresses")
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试创建一个工厂,创建具有几个地址的人.Factory_boy有SubFactory.但我只看到你如何在一对一的关系中使用它.我知道我可以用一个单独的工厂创建地址然后附加它们,但我想做像person =PersonFactory.create(num_addresses = 4)` 这样的事情.

有谁知道这在Factory_boy目前是否可行?

我使用factory_boy 2.4.1.

python sqlalchemy factory-boy

8
推荐指数
2
解决办法
2564
查看次数

工厂男孩:定义依赖于其他领域的领域

如何定义依赖于其他字段使用的字段factory-boy

例如,我想定义一个email取决于first namelast nameUser.

我尝试使用post_generation装饰器.但是,我的系统需要在创建实例之前定义电子邮件.

django django-testing factory-boy django-tests

8
推荐指数
1
解决办法
2126
查看次数

失败:不允许数据库访问,请使用“ django_db”标记或“ db”或“ transactional_db”固定装置将其启用

我的问题是一个波纹管。如果我尝试运行测试,则表明没有数据库权限,因此我必须添加该固定装置。问题是我已将该固定装置添加到我拥有的任何可能方法中,但仍然没有。因此,我假设我不知道在何处添加此标记。

它不应该是我调用这些对象的创建类的方法:test_can_get_page_details

如果我从将用户分配给那些属性中删除UserFactory,则测试有效。

pytest.ini

[pytest]
DJANGO_SETTINGS_MODULE=core.settings_test
Run Code Online (Sandbox Code Playgroud)

test_pages.py

import pytest
from bs4 import BeautifulSoup
import datetime
from django.core.urlresolvers import reverse
from interface.tests import factories


class TestPageDetail:
    @pytest.fixture
    def defaults(self, db):
        page = factories.PageFactory()
        url = page.get_absolute_url()
        return {
            'page': page,
            'url': url
        }

    @pytest.mark.integration
    def test_can_get_page_details(self, defaults, db, admin_client):
        response = admin_client.get(defaults['url'])
        assert 200 == response.status_code
Run Code Online (Sandbox Code Playgroud)

conftest.py

import pytest


@pytest.fixture
def initial_data(db):
    from interface.management.commands.initial_data import Command as InitialData
    InitialData().handle()


@pytest.fixture
def page_and_variable(db, initial_data):
    from interface.tests.factories import PageFactory, VariableFactory

    page …
Run Code Online (Sandbox Code Playgroud)

python django pytest factory-boy pytest-django

8
推荐指数
1
解决办法
5044
查看次数

Python导入错误“模块‘工厂’没有属性‘模糊’”

我是Factory_boy模块的新手。在我的代码中,我import factory然后使用此导入来访问模糊属性,factory.fuzzy然后它抛出 error module 'factory' has no attribute 'fuzzy'

我通过再次导入解决了这个问题
import factory from factory import fuzzy

这样做就没有错误。

这是什么原因啊!

python testing python-import factory-boy

8
推荐指数
1
解决办法
4102
查看次数

在父工厂上存储factory-boy的RelatedFactory对象

我有两个 Django 模型 (CustomerCustomerAddress),它们都ForeignKey彼此包含 s。我正在使用factory-boy 来管理这些模型的创建,并且无法将子工厂实例保存到父工厂上(使用使用类定义的关系RelatedFactory)。

我的两个模型:

class ExampleCustomerAddress(models.Model):
    # Every customer mailing address is assigned to a single Customer,
    # though Customers may have multiple addresses.
    customer = models.ForeignKey('ExampleCustomer', on_delete=models.CASCADE)

class ExampleCustomer(models.Model):
    # Each customer has a single (optional) default billing address:
    default_billto = models.ForeignKey(
        'ExampleCustomerAddress',
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        related_name='+')
Run Code Online (Sandbox Code Playgroud)

我有两个工厂,每个型号一个:

class ExampleCustomerAddressFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = ExampleCustomerAddress

    customer = factory.SubFactory(
        'ExampleCustomerFactory',
        default_billto=None)  # Set to None to prevent recursive address …
Run Code Online (Sandbox Code Playgroud)

python django factory-boy

8
推荐指数
1
解决办法
2933
查看次数

是否将过多的参数传递给构造函数被认为是反模式?

我正在考虑使用factory_boy库进行API测试.文档中的一个例子是:

class UserFactory(factory.Factory):
    class Meta:
        model = base.User

    first_name = "John"
    last_name = "Doe"
Run Code Online (Sandbox Code Playgroud)

对于这项工作,我们需要的first_name,last_name等被作为参数传递__init__()的方法base.User() class.但是,如果您有许多参数,则会导致以下情况:

class User(object):

    GENDER_MALE = 'mr'
    GENDER_FEMALE = 'ms'

    def __init__(self, title=None, first_name=None, last_name=None, is_guest=None,
             company_name=None, mobile=None, landline=None, email=None, password=None,
             fax=None, wants_sms_notification=None, wants_email_notification=None,
             wants_newsletter=None, street_address=None):

        self. title = title
        self.first_name = first_name
        self.last_name = last_name
        self.company_name = company_name
        self.mobile = mobile
        self.landline = landline
        self.email = email
        self.password = password
        self.fax = fax
        self.is_guest = is_guest
        self.wants_sms_notification …
Run Code Online (Sandbox Code Playgroud)

python factory-boy

7
推荐指数
3
解决办法
8112
查看次数