Integration with factory_boy

New in version 15.0.0.

You no longer require any third-party packages to integrate Mimesis with factory_boy.

Mimesis requires factory_boy to be installed, but it’s not a hard dependency. Therefore, you’ll need to install it manually, like this:

poetry add --group dev factory_boy

Alternatively, you can include it as an extra when installing Mimesis itself, like so:

poetry add --group dev mimesis[factory]

Utilization

Look at the example below and you’ll understand how it works:

class Account(object):
    def __init__(self, username, email, name, surname, age):
        self.username = username
        self.email = email
        self.name = name
        self.surname = surname
        self.age = age

Now, use the FactoryField class to define how fake data is generated:

import factory
from mimesis.plugins.factory import FactoryField

from account import Account

class AccountFactory(factory.Factory):
    class Meta(object):
        model = Account

    username = FactoryField('username', template='l_d')
    name = FactoryField('name', gender='female')
    surname = FactoryField('surname', gender='female')
    age = FactoryField('age', minimum=18, maximum=90)
    email = factory.LazyAttribute(
        lambda instance: '{0}@example.org'.format(instance.username)
    )
    access_token = FactoryField('token', entropy=32)

See factory_boy documentation for more information about how to use factories.

Configuration

You can also define custom field handlers for your factories. To do this, you need to define an attribute named field_handlers in the Params class of your factory.

Just like this:

import factory
from mimesis.plugins.factory import FactoryField

class FactoryWithCustomFieldHandlers(factory.Factory):
    class Meta(object):
        model = Guest # Your model here

    class Params(object):
        field_handlers = [
            ("num", lambda rand, **kwargs: rand.randint(1, 99)),
            ("nick", lambda rand, **kwargs: rand.choice(["john", "alice"])),
        ]

    age = FactoryField("num")
    nickname = FactoryField("nick")

See Custom Field Handlers for more information about how to define custom field handlers.

Factories and pytest

We also recommend to use pytest-factoryboy. This way it will be possible to integrate your factories into pytest fixtures.