Как я могу назначить каждого сотрудника (много) на проекты (много) и при этом отслеживать даты, когда они были назначены и удалены из каждого проекта? Я понимаю, что это тип отношений ManyToManyField в Django, где:

Как я могу назначить каждого сотрудника (много) на проекты (много) и при этом отслеживать даты, когда они были назначены и удалены из каждого проекта? Я понимаю, что это тип отношений ManyToManyField в Django, где:

class ContactTestCase(TestCase):
    def setUp(self):
        """Create model objects."""
        Contact.objects.create(
            name='Jane Doe',
            email='janedoe@gmail.com',
            phone='+2348123940567',
            subject='Sample Subject',
            message='This is my test message for Contact object.'
        )


    def test_user_can_compose_message(self):
        """ Test whether a user can compose a messsage in the contact form."""
        test_user = Contact.objects.get(name='Jane Doe')
        self.assertEqual(test_user.email, 'janedoe@gmail.com')
        self.assertEqual(test_user.phone, '+2348123940567')
        self.assertEqual(test_user.subject, 'Sample Subject')
        self.assertEqual(test_user.message, 'This is my test message for Contact object.')
Как я могу назначить каждого сотрудника (много) на проекты (много) и при этом отслеживать даты, когда они были назначены и удалены из каждого проекта? Я понимаю, что это тип отношений ManyToManyField в Django, где:
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.005s

OK
Destroying test database for alias 'default'...
В настоящее время я пишу тесты, используя модульные тесты Django (основанные на модуле стандартной библиотеки Python: unittest). Я написал этот тест для моей модели Contact, который проходит:

Однако в этом тесте мне пришлось использовать метод assertEqual 4 раза (при тестировании моделей с большим количеством полей может быть и больше). Кажется, что это не соответствует принципу DRY.

Из docs я знаю, что assertEqual(first, second, msg=None) проверяет, что первое и второе равны. Если значения не равны, тест будет провален.

Есть ли обходной путь или более элегантный подход к написанию таких тестов?

Идеальный вопрос! Добро пожаловать в сообщество качественных тестов!

  1. Создайте список/дикт с тестовыми примерами.
  2. Пройдитесь по списку и вызовите assert в контексте подтеста.
  3. Радуйтесь.

Пример здесь:

def test_user_can_compose_message(self):
    """ Test whether a user can compose a messsage in the contact form."""
    test_user = Contact.objects.get(name='Jane Doe')
    test_cases = {'email': 'janedoe@gmail.com', 'phone': '+2348123940567', 'subject': 'Sample Subject', 'message': 'This is my test message for Contact object.'}
    for field, value in test_cases.items():
        with self.subTest("wrong user subtest", field=field, ):
            self.assertEqual(getattr(test_user, field), value)

Кстати, не забывайте использовать factory boy и старайтесь избегать жестко закодированных констант. Вместо них вы можете использовать django.utils.crypto.render_string и т. д.

Вернуться на верх