代码之家  ›  专栏  ›  技术社区  ›  vishnu m c

如何使用数据测试Django中的get请求?

  •  2
  • vishnu m c  · 技术社区  · 7 年前

    我现在正在用Django为我的web应用程序编写测试。我有一个URL 127.0.0.1/home/device/(?P<item>[^/]+) item 是数据库中的设备名称。考虑一个无效的设备,在测试时,我给出了以下代码:

    response=self.client.get("/health/errorfiles/",{'item':'testdevice_R'})
    

    response=self.client.get("/health/errorfiles/testdevice_R/")
    

    但这一次,测试运行程序执行my view函数并给出TypeError,因为它不是无效设备。

    在这两种方法中,哪一种是get请求的正确用法?

    def showfiles(request,item):
    
    if request.user.is_anonymous():                                                             ## check if the user is valid
        return HttpResponseRedirect("/")
    
    db = MySQLdb.connect(host='localhost',user=root,passwd='123mcvis',db='test_db')
    
    s = db.cursor()                                                                      
    username=request.user                                                                     
    s.execute("Select tzone,type from device where user='%s' and device='%s'"%(username,item)                     
    tz=s.fetchone()
    timezone.activate(tz[0])
    s.close()
    return render(request,"Home/showdevices.html")
    

    这是我的视图函数,由于设备无效,它显示典型错误。

    class showfile_test(TestCase):
         def test_invalid(self):
    
               response=self.client.get("/health/errorfiles/testdevice_R/")
               self.assertEqual(response.status_code,404)
    

    回溯

       ERROR: test_invalid (HealthApp.tests2.showfile_test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/vishnumc/vishnu/project/django/official/version6.2.3/HealthApp/tests2.py", line 162, in test_showfiles_with_invalid_deviceid
        response=self.client.get("/health/errorfiles/invaliddevice/")
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/test/client.py", line 529, in get
        **extra)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/test/client.py", line 333, in get
        return self.generic('GET', path, secure=secure, **r)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/test/client.py", line 409, in generic
        return self.request(**r)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/test/client.py", line 494, in request
        six.reraise(*exc_info)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
        response = get_response(request)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
        response = self._get_response(request)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File "/home/vishnumc/vishnu/project/env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/home/vishnumc/vishnu/project/django/official/version6.2.3/HealthApp/views.py", line 118, in showfiles
        timezone.activate(tz[0])                                                                        ##setting current timezone to user's time zone for display timestamps
    TypeError: 'NoneType' object has no attribute '__getitem__'
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Alasdair    7 年前

    第一个示例是GET请求 /health/errorfiles/?item=testdevice_R item 在里面 request.GET

    /health/errorfiles/testdevice_R/ 要求获取 项目 因为你有一个命名组 (?P<item>[^/]+) 在您的URL模式中。

    r'/home/device/(?P<item>[^/]+)' .

    第二个版本的测试揭示了您认为的问题。您需要修复视图,使其不会升高 TypeError .

    理想情况下,您不应该这样编写原始SQL。Django允许您执行以下操作:

    from .models import Device
    
    from django.shortcuts import get_object_or_404, render
    
    def showhome(request, item):
        device = get_object_or_404(Device, user=request.user, item=item)
        if device is not None:
            timezone.activate(device.tzone)
        return render(request,"Home/showdevices.html", {'device': device})
    

    如果必须使用原始SQL,则不要使用字符串替换 %(username,item)

    s.execute("Select tzone,type from device where user=%s" and device=%s, (username, item))
    

    然后,您的代码处理以下情况: tz None ,以避免 .

    tz = s.fetchone()
    if tz is not None:
        timezone.activate(tz[0])
    else:
        # Decide what to do if no items returned