当我在Python解释器中运行此代码时,它返回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)
我错过了什么?测试不应该通过吗?
答案 0 :(得分:2)
我明白了。这是否意味着测试用例仅测试代码但不能使用 其测试中的任何实际数据库内容?
默认情况下没有,你也不想搞砸实际的数据库, 有一种通常的方法来为测试提供初始对象(实际的源可能不同,例如从文件加载)
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
名称听起来很奇怪,因为它似乎测试电影列表不是空的
答案 1 :(得分:0)
因为在tests you are using a temporary database中没有对象:
需要数据库的测试(即模型测试)将不会使用您的 “真实”(生产)数据库。创建单独的空白数据库 进行测试。
无论测试通过还是失败,测试数据库都是 所有测试都已执行时被销毁。
使用真实数据库进行测试很危险。特别是测试应该可以在其他机器上重现。你应该使用灯具进行测试。请看factory_boy。