通过使用shell检查该方法,以验证该方法的日期是否在未来:
python manage.py shell
由于未来的事情不是“最近”,这显然是错误的。
创建一个测试来公开这个bug
我们在shell中所做的就是测试这个问题,这正是我们在自动化测试中所能做的,所以让我们把它变成一个自动化测试。
应用程序测试的常规位置是应用程序的test.py文件;测试系统将自动在任何名称以test开头的文件中找到测试。
运行测试
python manage.py test polls
What happened is this:
1. manage.py test polls looked for tests in the polls application
2. it found a subclass of the django.test.TestCase class
3. 它为测试的目的创建了一个特殊的数据库
4. 它寻找测试方法——那些名字以 "test" 开始的方法
5. in test_was_published_recently_with_future_question it created a Question instance whose pub_date field is 30 days in the future
6. … and using the assertIs() method, it discovered that its was_published_recently() returns True, though we wanted it to return False
测试告诉我们哪些测试失败了,甚至是失败发生的那条线。
Fixing the bug
We already know what the problem is: Question.was_published_recently() should return False if its pub_date is in the future. Amend the method in models.py, so that it will only return True if the date is also in the past:
and run the test again
更全面的测试
While we’re here, we can further pin down the was_published_recently() method;事实上,如果修复一个我们引入的错误,那将是非常令人尴尬的。
在同一类中添加两个测试方法,以更全面地测试该方法的行为:
现在我们有三个测试来确认这个问题。最近发布的()为过去的、最近的和未来的问题返回了合理的值。
同样,polls 是一个简单的应用程序,但是无论它在将来会变得多么复杂,无论它与什么其他代码交互,我们现在都有一些保证,我们编写的测试方法将以预期的方式运行。
测试一个视图
polls 是相当没有区别的:它会发布任何问题,包括那些其pub_date字段存在于未来的问题。我们应该改善这种。在未来设置一个pub_date应该意味着这个问题在那个时候发布,但是在那之前是不可见的。
对视图的测试
当我们修复上面的错误时,我们先编写测试,然后再编写代码来修复它。事实上,这是测试驱动开发的一个简单的例子,但是我们做这项工作的顺序并不重要。
在我们的第一个测试中,我们密切关注代码的内部行为。对于这个测试,我们想要检查它的行为,因为它将由用户通过web浏览器体验
在我们试图解决任何问题之前,让我们先来看看我们可以使用的工具。
Django测试客户端
Django 提供了一个测试客户端来模拟用户在视图级别与代码交互. We can use it in tests.py or even in the shell.
我们将再次从shell开始,在这里我们需要做一些在tests.py中不需要的事情。第一个是在shell中设置测试环境:
python manage.py shell
setup_test_environment()安装一个模板渲染器,它将允许我们检查响应等响应的一些附加属性。否则将无法获得的上下文。 注意,这个方法没有设置一个测试数据库,因此下面将针对现有的数据库运行,并且输出可能会根据您已经创建的问题略有不同。. 如果你的TIME_ZONE 在settings.py中并不是正确的,你可能会得到意想不到的结果。如果你不记得更早地设置它,在继续之前检查它。
接下来,我们需要导入测试客户端类(稍后在测试中。我们将使用django.test。TestCase类,它有自己的客户端,所以这是不需要的):
With that ready, we can ask the client to do some work for us: