是否有任何方法可以抑制(即隐藏)测试失败或生成错误时工厂男孩生成的捕获的日志信息块?我在说这个:
SomeError: you encountered an error
----------- >> begin captured loggin << -----------
... DEBUG information
----------- >> end captured loggin << -------------
---------------------------------------------------
Ran 1 test...
Run Code Online (Sandbox Code Playgroud)
通常情况下,这些信息与解决问题无关或不必要,而且我需要向上滚动以查看导致错误的原因.
谢谢.
使用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) 当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)
错误 …
我正在为一个大型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,其中(后有些麻烦)由表示连接UserFactory和ProfileFactory
@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) 我使用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.
如何定义依赖于其他字段使用的字段factory-boy?
例如,我想定义一个email取决于first name和last name的User.
我尝试使用post_generation装饰器.但是,我的系统需要在创建实例之前定义电子邮件.
我的问题是一个波纹管。如果我尝试运行测试,则表明没有数据库权限,因此我必须添加该固定装置。问题是我已将该固定装置添加到我拥有的任何可能方法中,但仍然没有。因此,我假设我不知道在何处添加此标记。
它不应该是我调用这些对象的创建类的方法:test_can_get_page_details?
如果我从将用户分配给那些属性中删除UserFactory,则测试有效。
[pytest]
DJANGO_SETTINGS_MODULE=core.settings_test
Run Code Online (Sandbox Code Playgroud)
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)
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) 我是Factory_boy模块的新手。在我的代码中,我import factory然后使用此导入来访问模糊属性,factory.fuzzy然后它抛出 error module 'factory' has no attribute 'fuzzy'。
我通过再次导入解决了这个问题
import factory
from factory import fuzzy
这样做就没有错误。
这是什么原因啊!
我有两个 Django 模型 (Customer和CustomerAddress),它们都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) 我正在考虑使用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) factory-boy ×10
python ×8
django ×6
django-tests ×1
factory ×1
pytest ×1
sqlalchemy ×1
testing ×1