运行Django测试时出现TypeError

时间:2014-05-30 13:01:22

标签: python django unit-testing

我是Django或python的新手,但我目前正在与两者合作。现在我试图让我的测试工作。我在3个月前编写了这些简单的测试,并且我100%肯定他们当时的工作。此外,当我运行服务器并手动尝试不同的搜索时,我得到预期的结果,所以我知道视图至少是正确的(我知道它的可怕和缓慢,我会努力修复它)。我搜索过这个错误,但我发现唯一相关的事情是Ubuntu是我的问题,但我在Ubuntu和Windows 7上都试过了。我不知道当时和现在之间发生了什么,但是他们给了我以下错误:< / p> 编辑:我不知道为什么我的所有缩进都被忽略了:|哦,经过一些建议,我改变了一些事情,现在我得到了这样的失败:

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,},) 

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

相关问题