[Flask-Test] factory_boy

지수 🤓·2020년 7월 24일
0

Flask

목록 보기
3/4
post-thumbnail

factory_boy의 정체

가짜 객체를 만들어주는 역할입니다.

만들어보자

user 객체를 예로 들겠습니다.
현재 mongo db를 사용중이라서 factory안에 정의 된 mongoengine factory를 사용하겠습니다.

Faker

사실적인 값인데 랜덤으로 만드는 경우

class RandomUserFactory(factory.Factory):
    class Meta:
        model = models.User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')

Lazy Function

해당 함수가 build중인 object에 의존하지 않는 경우
인수를 취하지 않고 값을 리턴하는 함수

class LogFactory(factory.Factory):
    class Meta:
        model = models.Log

    timestamp = factory.LazyFunction(datetime.now)
LogFactory()
<Log: log at 2016-02-12 17:02:34>

# The LazyFunction can be overriden
LogFactory(timestamp=now - timedelta(days=1))
<Log: log at 2016-02-11 17:02:34>

Lazy Attributes

factroy를 통해 값을 만든 다음에 그 값을 사용하는 경우

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

    username = factory.Sequence(lambda n: 'user%d' % n)
    email = factory.LazyAttribute(lambda obj: '%s@example.com' % obj.username)
UserFactory()
<User: user1 (user1@example.com)>

# The LazyAttribute handles overridden fields
UserFactory(username='john')
<User: john (john@example.com)>

# They can be directly overridden as well
UserFactory(email='doe@example.com')
<User: user3 (doe@example.com)>

Sequence

특정 포맷을 가지는 유니크한 value를 만드는 경우
값이 계속 증가하는 형태로 만들어진다.

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

    email = factory.Sequence(lambda n: 'person{}@example.com'.format(n))

>>> UserFactory().email
'person0@example.com'
>>> UserFactory().email
'person1@example.com'

Associations

다른 모델과 관계가 있는 경우

class PostFactory(factory.Factory):
    class Meta:
        model = models.Post

    author = factory.SubFactory(UserFactory)

직접 값을 지정하는 경우

UserFactory(firstname="Jack")

사용해보자

# Returns a User instance that's not saved
user = UserFactory.build()

# Returns a saved User instance.
# UserFactory must subclass an ORM base class, such as DjangoModelFactory.
user = UserFactory.create()

# Returns a stub object (just a bunch of attributes)
obj = UserFactory.stub()

참고 링크

profile
Backend Junior Developer

0개의 댓글