Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元测试失败,表示';WSGIRequest&x27;对象没有属性';城市';_Python_Django - Fatal编程技术网

Python 单元测试失败,表示';WSGIRequest&x27;对象没有属性';城市';

Python 单元测试失败,表示';WSGIRequest&x27;对象没有属性';城市';,python,django,Python,Django,我已经编写了一个单元测试来测试api…这是一个GET调用。。。。 当我运行它,我得到这个错误…这是回溯 Traceback (most recent call last): File "/home/arindam31/XXX-Name/mapi/tests.py", line 141, in test_get_cities response = self.cl.get('/mapi/latest/cities/') File "/usr/local/lib/python2.7/d

我已经编写了一个单元测试来测试api…这是一个GET调用。。。。 当我运行它,我得到这个错误…这是回溯

Traceback (most recent call last):
  File "/home/arindam31/XXX-Name/mapi/tests.py", line 141, in test_get_cities
    response = self.cl.get('/mapi/latest/cities/')
  File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 445, in get
    response = super(Client, self).get(path, data=data, **extra)
  File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 229, in get
    return self.request(**r)
  File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 387, in request
    response = self.handler(environ)
  File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 84, in __call__
    response = self.get_response(request)
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 169, in get_response
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 218, in handle_uncaught_exception
    return callback(request, **param_dict)
  File "/home/arindam31/XXX-Name/saul/views.py", line 546, in do_handle_500
    return render_to_response("500.html", context_instance=RequestContext(request))
  File "/usr/local/lib/python2.7/dist-packages/django/template/context.py", line 177, in __init__
    self.update(processor(request))
  File "/home/arindam31/XXX-Name/saul/context_processors.py", line 46, in common_context
    ret_dict['city'] = request.city
AttributeError: 'WSGIRequest' object has no attribute 'city'
这是我的单元测试

def test_get_cities(self):
    request = HttpRequest()
    request.city = self.c1
    response = self.cl.get('/mapi/latest/cities/')
    content = response.content
    data = json.loads(content)
    for city in City.objects.all():
        assert city.name in data
        assert data[city.name] == city.pk
在这里,self.c1是设置部分中的城市类型对象……HttpRequest来自django.http

正在测试的视图如下所示:

def get_cities(request): 
    print "1"
    if ENABLE_HTTPS_CHECK and not request.is_secure():
        return HttpResponseForbidden()
    if request.method != 'GET':
        return HttpResponseNotAllowed('Not allowed')
    city_map = _get_city_map()
    response = HttpResponse(json.dumps(city_map)
    content_type='application/json')
    response['Cache-Control'] = 'no-cache'
    return response

我不知道你在这里想干什么。实例化一个请求对象,分配一个城市属性,然后继续忽略该对象,只使用标准测试客户端。我不知道为什么你会认为该请求会被用于客户获取


老实说,我认为你的整个设计都被破坏了。在正常的非测试场景中,您不会显示希望如何将参数输入到请求中,但通常您会通过POST或get参数传递参数,而不是以某种方式将其注释到请求中。这当然会使测试更容易,因为您可以将字典传递给客户端调用。

如果您想用自己的请求对象测试视图,应该直接调用视图。您应该使用创建请求

正如Daniel Roseman指出的那样,具有city属性的请求对象仍然处于中断状态,除非您有一些中间件来设置它。显然,您有一些中间件要求在
saul/context\u processors.py
中设置它

使用
RequestFactory
并直接调用视图会完全绕过中间件,因此您可以集中精力测试视图(如果视图支持缺少的中间件)


如果视图要求middelware可以运行,那么您可能只需要使用测试客户端登录即可。它有一个会话pr测试方法。

它是self.c1….一个城市类型的对象….因为找不到城市属性,所以我认为我需要自己创建一个请求对象…所以我创建了请求对象…现在get调用不需要传递参数…这是一个直接调用…现在我不明白如何使用city提供一个请求对象…我认为这样做不起作用…为什么不显示您的视图?然后我们将知道这是如何期望城市参数的。但是,在上面的代码中,您没有对请求执行任何操作。嗨,丹尼尔,很抱歉响应太晚…以下是视图。。。def get_cities(请求):59如果启用HTTPS检查而不请求,则打印“1”60。是否安全():61如果请求,则打印“2”62返回HttpResponseForbidden()63.method!='GET':64 print'3'65 return HttpResponseNotAllowed('Not allowed')66 city_map=\u GET_city_map()67 print'4'68 response=HttpResponse(json.dumps(city_map),69 content_type='application/json')70 response['Cache-Control]='no Cache'71返回响应我添加了打印