为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕虎7371278 2022-09-06 18:01:39
假设我有以下网址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如何测试?contextclass 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'----------------------------------------------------------------------为什么会这样呢?我设法通过和明确地解决了我的问题,但它看起来有点特别:statusorderdef 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()
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

如果要检查响应上下文中的内容,首先需要使用响应对象(而您不是,您只是在创建视图的实例,而不是获取视图生成的响应)。我不知道,但我相信你会找到如何使我的答案适应你的用例。RequestFactory


所以,它会像这样:


def test_your_context(self):

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

    self.client.force_login(user) # because of the login_required decorator

    response = self.client.get(reverse("browse_clients"))

    assert response.context['your_context_key'] == "Anything you want to check"

只需做几件事就可以进一步说明:

  • 你的方法的定义对我来说似乎没问题,get_context_data

  • 如果您使用基于类的视图,如果您要检查用户是否登录,我会建议您也使用基本视图(LoginRequiredMixin)

  • 你给你的网址起了个名字,所以只是使用它,而不是写它的原始形式(这就是我在答案中所做的)。


查看完整回答
反对 回复 2022-09-06
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

如果使用测试客户端,它将负责运行中间件和初始化视图。


当您直接使用和调用视图时,URL 处理程序不会运行,因此由您来传递 kwargs。setup()


def test_return_client_ordered_by_inscription_date(self): 

    view = BrowseClients()

    view.setup(self.request, order='inscription')

    context = view.get_context_data()


查看完整回答
反对 回复 2022-09-06
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信