Три функции python заменить одним методом

Есть три функции:

    def test_post_index_page_show_correct_context(self):
    """Проверяем Context страницы index"""
    response = self.authorized_client.get(reverse('posts:index'))
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)

def test_post_posts_groups_page_show_correct_context(self):
    """Проверяем Context страницы posts_groups"""
    response = self.authorized_client.get(
        reverse('posts:group_list', kwargs={'slug': self.group.slug}))
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)

def test_post_profile_page_show_correct_context(self):
    """Проверяем Context страницы profile"""
    response = self.authorized_client.get(
        reverse('posts:profile', kwargs={
            'username': self.author.username}))
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)

Нужно заменить их одним методом по принципу DRY. Ревьюер в проекте мне указал: Ревьюер пишет: "Код проверок контекста дублируется - проверку контекста можно вынести в отдельный метод и вызвать в самих тестах". Помогите, как это сделать?


Ответы (2 шт):

Автор решения: Roman-Stop RU aggression in UA

Так:

def test_post_posts_groups_page_show_correct_context(self):
    """Проверяем Context страницы posts_groups"""
    response = self.authorized_client.get(
        reverse('posts:group_list', kwargs={'slug': self.group.slug}))

    self.check_context_is_correct(response)

def check_context_is_correct(self, response):
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)
→ Ссылка
Автор решения: Давид Князев

Я попробовал так, посмотрим, что ревьюер ответит:

def exttest_post_index_group_profile_page_show_correct_cont(self):
    """Проверяем Context страницы index, group, profile"""
    context = [
        self.authorized_client.get(reverse('posts:index')),
        self.authorized_client.get(reverse(
            'posts:group_list', kwargs={'slug': self.group.slug})),
        self.authorized_client.get(reverse(
            'posts:profile', kwargs={'username': self.author.username})),
    ]
    for response in context:
        first_object = response.context['page_obj'][0]
        context_objects = {
            self.author.id: first_object.author.id,
            self.post.text: first_object.text,
            self.group.slug: first_object.group.slug,
            self.post.id: first_object.id,
        }
        for reverse_name, response_name in context_objects.items():
            with self.subTest(reverse_name=reverse_name):
                self.assertEqual(response_name, reverse_name)
→ Ссылка