我正在关注Django测试的教程。 Pycharm从test.py中的代码中抛出错误。
create_question
中的
QuestionViewTests(TestCase)
和
QuestionIndexDetailTests(TestCase) class's have are all throwing errors. But the
create_question
里面的
QuestionMethodTests(TestCase)
班级有效。我有打字,复制和粘贴,它仍然无法正常工作。我也试过File>使高速缓存失效...并重新启动PyCharm,但这也无效。我也对课程感到困惑
QuestionViewTests(TestCase)
和
QuestionIndexDetailTests(TestCase)
他们是否在上面列出的第一类
QuestionMethodTests(TestCase)
因为它在我不知道的网站上的样子。我已将它们都移入和移出课程,但它仍无法正常工作。欢迎提出任何建议。
我的代码
import datetime
from django.utils import timezone
from django.test import TestCase
from django.core.urlresolvers import reverse
from .models import Question
class QuestionMethodTests(TestCase):
def test_was_published_recently_with_future_question(self):
"""
was_published_recently() 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.assertEqual(future_question.was_published_recently(), False)
def test_was_published_recently_with_old_question(self):
"""
was_published_recently() should return False for questions whose
pub_date is older than 1 day.
"""
time = timezone.now() - datetime.timedelta(days=30)
old_question = Question(pub_date=time)
self.assertEqual(old_question.was_published_recently(), False)
def test_was_published_recently_with_recent_question(self):
"""
was_published_recently() should return True for questions whose
pub_date is within the last day.
"""
time = timezone.now() - datetime.timedelta(hours=1)
recent_question = Question(pub_date=time)
self.assertEqual(recent_question.was_published_recently(), True)
def create_question(question_text, days):
"""
Creates a question with the given `question_text` and published the
given number of `days` offset to now (negative for questions published
in the past, positive for questions that have yet to be published).
"""
time = timezone.now() + datetime.timedelta(days=days)
return Question.objects.create(question_text=question_text, pub_date=time)
class QuestionViewTests(TestCase):
def test_index_view_with_no_questions(self):
"""
If no questions exist, an appropriate message should be displayed.
"""
response = self.client.get(reverse('polls:index'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "No polls are available.")
self.assertQuerysetEqual(response.context['latest_question_list'], [])
def test_index_view_with_a_past_question(self):
"""
Questions with a pub_date in the past should be displayed on the
index page.
"""
create_question(question_text="Past question.", days=-30)
response = self.client.get(reverse('polls:index'))
self.assertQuerysetEqual(
response.context['latest_question_list'],
['<Question: Past question.>']
)
def test_index_view_with_a_future_question(self):
"""
Questions with a pub_date in the future should not be displayed on
the index page.
"""
create_question(question_text="Future question.", days=30)
response = self.client.get(reverse('polls:index'))
self.assertContains(response, "No polls are available.", status_code=200)
self.assertQuerysetEqual(response.context['latest_question_list'], [])
def test_index_view_with_future_question_and_past_question(self):
"""
Even if both past and future questions exist, only past questions
should be displayed.
"""
create_question(question_text="Past question.", days=-30)
create_question(question_text="Future question.", days=30)
response = self.client.get(reverse('polls:index'))
self.assertQuerysetEqual(
response.context['latest_question_list'],
['<Question: Past question.>']
)
def test_index_view_with_two_past_questions(self):
"""
The questions index page may display multiple questions.
"""
create_question(question_text="Past question 1.", days=-30)
create_question(question_text="Past question 2.", days=-5)
response = self.client.get(reverse('polls:index'))
self.assertQuerysetEqual(
response.context['latest_question_list'],
['<Question: Past question 2.>', '<Question: Past question 1.>']
)
class QuestionIndexDetailTests(TestCase):
def test_detail_view_with_a_future_question(self):
"""
The detail view of a question with a pub_date in the future should
return a 404 not found.
"""
future_question = create_question(question_text='Future question.',
days=5)
response = self.client.get(reverse('polls:detail',
args=(future_question.id,)))
self.assertEqual(response.status_code, 404)
def test_detail_view_with_a_past_question(self):
"""
The detail view of a question with a pub_date in the past should
display the question's text.
"""
past_question = create_question(question_text='Past Question.',
days=-5)
response = self.client.get(reverse('polls:detail',
args=(past_question.id,)))
self.assertContains(response, past_question.question_text,
status_code=200)
答案 0 :(得分:2)
您缩进了create_question的定义,因此它看起来像QuestionMethodTests的成员。基本上你这样做了:
class Foo:
...
def create_question(x):
...
create_question(3)
当我想时,你打算这样做:
class Foo:
...
def create_question(x):
...
create_question(3)
答案 1 :(得分:1)
create_question
的实例未调用QuestionMethodTests
的任何来电;它不是一个全局函数,它是QuestionMethodTests
实例的方法,所以你需要创建一个QuestionMethodTests
对象并调用它。当然,你在self
的定义中省略了最初的create_question
参数,所以即使你设法调用它,它也不会起作用。
那就是说,create_question
看起来并不像成员函数那样有意义;将它移动到文件的顶层(在任何类定义之外)可能就是你想要的;它修复了将其作为实例方法调用的需要,并且您不需要添加self
作为参数。