I am considering using the factory_boy library for API testing. An example from the documentation is:
class UserFactory(factory.Factory):
class Meta:
model = base.User
first_name = "John"
last_name = "Doe"
For this to work, we need first_name
, last_name
, etc to be passed as parameters to the __init__()
method of the base.User() class
. However, if you have many parameters this leads to something like:
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 = wants_sms_notification
self.wants_email_notification = wants_email_notification
self.wants_newsletter = wants_newsletter
self.company_name = company_name
self.street_address = street_address
Now the question is, is this construction considered anti-pattern, and if yes, what alternatives do I have?
Thanks
__init__ ()
method on your class to usefactory_boy
unless it's changed since v2.4.1. – Protuberancymobile
,landline
andfax
fields, make guest users a subclass instead of a field, and so on. – Jelksself
you have no positional arguments in this__init__
method. No one needs to worry about ifmobile
goes in position 10 or 14 since it is specified by keyword. – Grottodef __init__(self, **kwargs): self.name=kwargs.get('name', None)
– ProtuberancyContactInformation()
andSubscritionPreferences()
. Basically group some arguments into logical objects. – Dior