【问题标题】:TypeError while running Django tests运行 Django 测试时出现 TypeError
【发布时间】:2014-05-30 13:01:22
【问题描述】:

我是 Django 或 python 的新手,但我目前正在与这两个项目一起工作。现在我试图让我的测试工作。大约 3 个月前,我编写了这些简单的测试,我 100% 确定它们当时有效。此外,当我运行服务器并手动尝试不同的搜索时,我得到了预期的结果,所以我知道视图至少是正确的(我知道它可怕且缓慢,我会努力修复它)。我已经搜索过这个错误,但我发现唯一相关的是 Ubuntu 是我的问题,但我在 Ubuntu 和 Windows 7 上都试过了。我不知道从那时到现在发生了什么,但他们给了我以下错误:

编辑:我不知道为什么我所有的缩进都被忽略了:|哦,好吧,经过一些建议,我改变了一些东西,现在我遇到了这样的失败:

enrique@enrique-XPS-L521X:~/Documents/Reeduq$ 
python manage.py test Search
Creating test database for alias 'default'...
FF
======================================================================
FAIL: test_private_courses_search (Search.tests.SearchTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/enrique/Documents/Reeduq/Search/tests.py", line 18, in test_private_courses_search
  self.assertEqual(response.context['found_entries'],[])
  AssertionError: [] != []
======================================================================
FAIL: test_public_course_search (Search.tests.SearchTests)
----------------------------------------------------------------------
Traceback (most recent call last): 
File "/home/enrique/Documents/Reeduq/Search/tests.py", line 29, in test_public_course_search   
   self.assertEqual(response.context['found_entries'],['<Course: test>'])
   AssertionError: [<Course: test>] != ['<Course: test>']
----------------------------------------------------------------------
Ran 2 tests in 0.018s

FAILED (failures=2)
Destroying test database for alias 'default'...

我读到这意味着我没有 __unicode__ 函数或类似的东西,但我的课程模型和用户模型各有一个,所以我不知道该怎么做

这是测试代码:

from django.test import TestCase
from django.shortcuts import render, get_object_or_404, redirect, render_to_response, redirect
from django.core.urlresolvers import reverse
from Search.views import search
from Course.models import *
from Reeduq_Home.models import *
class SearchTests(TestCase):    
    def test_private_courses_search(self):
        """     
        a search should not return private courses      
        """     
        new_user=EndUser.objects.create(username="test", first_name="test", last_name="test", email="t@t.com", password="test", account_type="E")         
        Course.objects.create(name="test", instructor=new_user, description="test", tags="test", start_date="2014-3-9", end_date="2014-3-10", public=False)       
        response=self.client.get(reverse('Search:search', args=("test",)))
        self.assertEqual(response.status_code, 200)
        self.assertQuerysetEqual(response.context['found_entries'],[])  

    def test_public_course_search(self):        
        """     
        a search should return public courses       
        """
        new_user=EndUser.objects.create(username="test", first_name="test", last_name="test", email="t@t.com", password="test", account_type="E")
        Course.objects.create(name="test", instructor=new_user, description="test", tags="test, wat, wait", start_date="2014-3-9", end_date="2014-3-10", public=True)
        response=self.client.get(reverse('Search:search', args=("wat",)))
        self.assertEqual(response.status_code, 200)
        self.assertQuerysetEqual(response.context['found_entries'],['<Course: test>'])

这是查看代码:

def search(request, query):
   query=query.replace('_', ' ')    
   found_entries = []    
   objects = Course.objects.all()    
   for p in objects:        
       a=[x.strip() for x in p.tags.split(',')] 
       for i in a:      
           if i == query:           
              if p.public:              
                   found_entries.append(p.id)    
   results = Course.objects.all().filter(pk__in=found_entries)    

    return render_to_response('search.html',
            { 'query': query, 'found_entries': results,},) 

感谢您的帮助。

【问题讨论】:

  • 只是为了检查一下,如果您暂时删除 @login_required 装饰器并再次运行测试会发生什么?
  • 你还能断言response.status_code == 200吗?
  • @alecxe omg 我不敢相信这有效,哈哈,现在我得到一个错误:AssertionError[]!=[],这很奇怪,但至少它现在有点工作

标签: python django unit-testing


【解决方案1】:

不确定您从哪里获得 unicode 注释。 response.context['found_entries'] 在幕后是在做response.context.__get__item('found_entries'),除了 response.context 是 None。 正如@AlexShkop 指出的那样,听起来您的响应不是您所期望的,可能是因为您实际上获得了 302 重定向(或 401/403)。您可以尝试@alecxe 的建议,或者使用内置的 client.login 功能(在创建虚拟用户之后)

猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2021-03-30
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2020-05-13
相关资源
最近更新 更多