1

我在 url 中使用 UUID 而不是主键。我假设但不确定这是我在测试 CBV 时遇到问题的原因。

我对用户个人资料的看法:

class ProfileView(DetailView):
    slug_url_kwarg = 'uuid'
    slug_field = 'uuid'

    model = User
    template_name = 'users/profile.html'
    context_object_name = 'user_profile'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['uuid'] = self.kwargs.get("uuid")
        return context

我的网址:

path(
    route='profile/<uuid:uuid>',
    view=views.ProfileView.as_view(),
    name='profile',
),

我无法测试 get_context_data,Django 告诉我我的视图没有“对象”属性。也许我需要覆盖 get_object,但我的搜索没有找到任何东西。

我的测试:

class BaseTest(TestCase):
    def setUp(self):
        # Set up non-modified objects used by all test methods
        self.factory = RequestFactory()
        self.user2 = User.objects.create_user(
            email='caroline.dupont@free.fr',
            password='fhh456GG455t',
            status='VALIDATED',
            )
    
        return super().setUp()

    def profile_view_instance(self, test_user):
        request = self.factory.get(reverse('profile', args=(test_user.uuid,)))
        request.user = test_user
        view = ProfileView()
        view.setup(request)
    
        return view

class ProfileViewTestCase(BaseTest):

    def test_get_context_data(self):
        self.client.force_login(self.user2)
        context = self.profile_view_instance(self.user2).get_context_data()
        self.assertIn('uuid', context)

错误 :

ERROR: test_get_context_data (tests.appusers.test_views.ProfileViewTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\Developpement\projet13\tests\appusers\test_views.py", line 75, in test_get_context_data
    context = self.profile_view_instance(self.user2).get_context_data()
  File "D:\Developpement\projet13\users\views.py", line 66, in get_context_data
    context = super().get_context_data(**kwargs)
  File "D:\Developpement\projet13\venvp13\lib\site-packages\django\views\generic\detail.py", line 94, in get_context_data
if self.object:
AttributeError: 'ProfileView' object has no attribute 'object'
4

1 回答 1

0

profile_view_instance还不够: a在触发之前必须运行DetailView的方法中有一些样板逻辑。在测试函数中实现这个逻辑也不是一个好主意,因为那样你会重复逻辑,每次更新 Django 版本时都要更新它会很痛苦。.get(…).get_context_data(…)

Django 创建了一个可以用来触发视图的客户端。你可以定义一个测试:

class ProfileViewTestCase(BaseTest):

    def test_get_context_data(self):
        self.client.force_login(self.user2)
        response = self.client.get(f'/profile/{self.user2.uuid}')
        context = response.context
        self.assertIn('uuid', context)
于 2021-12-12T17:32:56.103 回答