1 django django-models django-tests
Django 新手,我一直在学习第 1 篇教程,现在正在学习第 5 部分,即自动化测试。
按照教程进行到“修复Bug ”步骤后,运行测试时弹出错误,如下:
Traceback (most recent call last):
File "D:\Python\Django\ui1\polls\tests.py", line 13, in test_was_published_recently_with_future_question
self.assertIs(future_question.was_published_recently(), False)
AttributeError: 'Question' object has no attribute 'was_published_recently'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
而在教程页面中,测试中没有显示错误。
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
这是我的代码。
测试.py
import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question
class QuestionMethodTests(TestCase):
def test_was_published_recently_with_future_question(self):
#should return False for questions whose pub_date is in the future.
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)
Run Code Online (Sandbox Code Playgroud)
模型.py
from django.db import models
class Question(models.Model):
question_text= models.CharField(max_length=200)
pub_date=models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question= models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
Run Code Online (Sandbox Code Playgroud)
您需要将函数移到类内,它现在不属于 Question 类。
class Question(models.Model):
...
def was_published_recently(self):
...
Run Code Online (Sandbox Code Playgroud)