代码之家  ›  专栏  ›  技术社区  ›  user3084860

Django在从请求对象检索标头时测试KeyError

  •  1
  • user3084860  · 技术社区  · 10 年前

    所以我试图在测试期间确认给定视图的位置。医生说:

    还可以对响应对象使用字典语法来查询 HTTP标头中任何设置的值。例如,您可以 使用确定响应的内容类型 响应['Content-Type']。

    然而,当我使用它时,我得到了一个关键错误。请帮忙。

    测试:

    def test_normal_rewardstore_usage(self):    
        logged_in = self.client.login(username=self.u1.username, password="psst")
        response = self.client.get(reverse('rewards:rewardstore'))
        location = "http://testserver%s" % (reverse('rewards:rewardpage', kwargs={'company':self.r1.company.slug, 'slug':self.r1.slug}))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response['Location'], location)
    

    错误:

    Traceback (most recent call last):
      File "/app/rewards/tests/test_views.py", line 58, in test_normal_rewardstore_usage
        self.assertEqual(response['Location'], location)
      File "/app/.heroku/python/lib/python2.7/site-packages/django/http/response.py", line 189, in __getitem__
        return self._headers[header.lower()][1]
    KeyError: 'location'
    

    视图:

    def RewardStore_Index(request, template='rewards/reward-store.html', page_template='rewards/rewards_page.html'):
        user = User.objects.get(pk=request.user.pk)
        contact = Contact.objects.get(user__pk=request.user.pk, is_active=True)
        if request.user.is_authenticated():
        a = Member.objects.get(pk=request.user.pk)
        a = a.account_verified
        rewards = Reward.objects.filter(country__iso=contact.get_country)
        else:
        a = False
        g = GeoIP()
        c = g.country(request.user)
        c = c['country_code']
        rewards = Reward.objects.filter(country__iso=c)
        context = {
        'targetuser': request.user,
            'rewards': rewards,
            'page_template': page_template,
            'email_authenticated': True if a else False,
        'notifications': NotificationMap.objects.filter(user__pk=request.user.pk, read=False).prefetch_related('notification', 'notification__users')
        }
        if request.is_ajax():
            template = page_template
        return render_to_response(
            template, context, context_instance=RequestContext(request))
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   Tim Saylor    10 年前

    响应对象中可用的标头将因所使用的服务器而异( source ),所以如果django测试运行器没有发送回您在生产中看到的所有标头,我不会感到惊讶。此外,Location通常用于重定向响应,并且您声称您首先收到了200。你确定在这种情况下你应该期待一个位置标头吗?