Django:测试由url模式触发的基于TemplateView的视图?

假设我有以下网址


path('clients/by_<str:order>', BrowseClients.as_view(), name='browse_clients')

及其相应的视图


@method_decorator(login_required, name='dispatch')

class BrowseClients(TemplateView):


    template_name = "console/browse_clients.html"


    def get_context_data(self, **kwargs):

        context = super().get_context_data(**kwargs)

        context['clients'] = Client.objects.filter(

            owner=self.request.user.id).order_by(self.kwargs["order"])

        context['form'] = AddClientForm()

        return context

如何测试?context


class TestBrowseClientsView(TestCase, GeneralViewTest):

    fixtures = ['users.yaml', 'clients.yaml']


    def setUp(self):

        self.request = RequestFactory().get('/console/clients/by_inscription')

        self.request.user = User.objects.get(pk=1)


    def test_return_client_ordered_by_inscription_date(self): 

        view = BrowseClients()

        view.setup(self.request)

        context = view.get_context_data()

天真地,我以为这会根据中发现的模式“喂养”相关内容。但事实似乎并非如此。view.setup(self.request).get_context_data()kwargsself.request


======================================================================

ERROR: test_return_client_ordered_by_inscription_date (console.tests.TestBrowseClientsView)

----------------------------------------------------------------------

Traceback (most recent call last):

  File "/usr/src/jengu/console/tests.py", line 164, in test_return_client_ordered_by_inscription_date

    context = view.get_context_data()

  File "/usr/src/jengu/console/views.py", line 34, in get_context_data

    owner=self.request.user.id).order_by(self.kwargs["order"])

KeyError: 'order'


----------------------------------------------------------------------

为什么会这样呢?我设法通过和明确地解决了我的问题,但它看起来有点特别:statusorder


def get_context_data(self, status, order, **kwargs):

    def test_return_clients_ordered_by_parameter(self): 

        view = BrowseClients()

        view.setup(self.request)

        context = view.get_context_data("all", "inscription")

在这里提到的不同选项中,哪一个更规范?我是否走错了路,在定义时显式使用变量?get_context_data()


慕虎7371278
浏览 106回答 2
2回答

一只甜甜圈

如果要检查响应上下文中的内容,首先需要使用响应对象(而您不是,您只是在创建视图的实例,而不是获取视图生成的响应)。我不知道,但我相信你会找到如何使我的答案适应你的用例。RequestFactory所以,它会像这样:def test_your_context(self):&nbsp; &nbsp; user = User.objects.get(pk=1)&nbsp; &nbsp; self.client.force_login(user) # because of the login_required decorator&nbsp; &nbsp; response = self.client.get(reverse("browse_clients"))&nbsp; &nbsp; assert response.context['your_context_key'] == "Anything you want to check"只需做几件事就可以进一步说明:你的方法的定义对我来说似乎没问题,get_context_data如果您使用基于类的视图,如果您要检查用户是否登录,我会建议您也使用基本视图(LoginRequiredMixin)你给你的网址起了个名字,所以只是使用它,而不是写它的原始形式(这就是我在答案中所做的)。

慕桂英546537

如果使用测试客户端,它将负责运行中间件和初始化视图。当您直接使用和调用视图时,URL 处理程序不会运行,因此由您来传递 kwargs。setup()def test_return_client_ordered_by_inscription_date(self):&nbsp;&nbsp; &nbsp; view = BrowseClients()&nbsp; &nbsp; view.setup(self.request, order='inscription')&nbsp; &nbsp; context = view.get_context_data()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python