가짜 객체를 만들어주는 역할입니다.
user 객체를 예로 들겠습니다.
현재 mongo db를 사용중이라서 factory안에 정의 된 mongoengine factory를 사용하겠습니다.
사실적인 값인데 랜덤으로 만드는 경우
class RandomUserFactory(factory.Factory):
class Meta:
model = models.User
first_name = factory.Faker('first_name')
last_name = factory.Faker('last_name')
해당 함수가 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>
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)>
특정 포맷을 가지는 유니크한 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'
다른 모델과 관계가 있는 경우
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()