2015-06-19 63 views
1

当我在Python解释器运行这段代码,它返回true:为什么Django中的测试用例在Python intrepreter中返回True时失败?

>>> from movies.models import Movie 
>>> movie_list = Movie.objects.all() 
>>> bool(movie_list) 
True 

当我运行我的测试情况下,python3 manage.py test movies,它失败:

from django.test import TestCase 
from .models import Movie 

class QuestionMethodTests(TestCase): 

    def test_movie_list_empty(self): 
     movie_list = Movie.objects.all() 
     self.assertEqual(bool(movie_list), True) 

我缺少什么?测试不应该通过?

+3

因为在测试中您使用的临时数据库没有对象? – warvariuc

+0

我明白了。这是否意味着测试用例只测试代码,但不能在测试中使用任何实际的数据库内容? –

+1

使用真实数据库进行测试是很危险的。尤其是那些测试应该可以在其他机器上重现。你应该使用灯具进行测试。看看[factory_boy](http://factoryboy.readthedocs.org/en/latest/orms.html) – warvariuc

回答

0

由于tests you are using a temporary database不具有的对象:

测试,需要一个数据库(即模型试验)不会将您的 “真实”(生产)数据库。为测试创建单独的空白数据库 。

无论测试通过还是失败,测试数据库都是 在所有测试执行完毕后销毁。

使用真实数据库进行测试是很危险的。尤其是那些测试应该可以在其他机器上重现。你应该使用灯具进行测试。看看factory_boy

2

我明白了。这是否意味着测试用例仅测试代码,但不能在其测试中使用任何实际的数据库内容?

默认情况下没有了,你不想惹实际DB反正 有一个通常的方式来提供从文件用于测试的初始对象(实际源可以有所不同,例如,装载)

from django.test import TestCase 
from .models import Movie 

class QuestionMethodTests(TestCase): 

    def setUp(self): 
     # You can create your movie objects here 
     Movie.objects.create(title='Forest Gump', ...) 

    def test_movie_list_empty(self): 
     movie_list = Movie.objects.all() 
     self.assertEqual(bool(movie_list), True) 

TestCase类还包含一个setUpTestData方法,如果你看中的是,https://docs.djangoproject.com/en/1.8/topics/testing/tools/#django.test.TestCase.setUpTestData

PS:test_movie_list_empty名字听起来有些不可思议,原因它似乎测试电影列表不是空的