2015-12-18 35 views
0

我正在关注Django测试教程。 Pycharm从test.py中的代码中抛出错误。我该如何解决这个python错误“全局名称'create_question'没有定义”

create_question 

QuestionViewTests(TestCase) 

QuestionIndexDetailTests(TestCase) class's have are all throwing errors. But the 

create_question 

QuestionMethodTests(TestCase) 

类作品里面。我既输入并复制粘贴,它仍然不起作用。我也尝试过File> Invalidate Caches ...并重新启动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) 

回答

1

您缩减了create_question的定义,使它看起来像QuestionMethodTests的成员。从本质上讲,你这样做:

class Foo: 
    ... 

    def create_question(x): 
     ... 

create_question(3) 

当我认为你的意思是这样:

class Foo: 
    ... 

def create_question(x): 
    ... 

create_question(3) 
+0

这就是它固定它谢谢 – losee

1

您的通话create_question没有被要求的QuestionMethodTests一个实例;它不是一个全局函数,它是一个QuestionMethodTests实例的方法,因此您需要制作一个QuestionMethodTests对象并调用它。当然,你在create_question的定义中忽略了最初的self参数,所以即使你设法调用它,它也不起作用。

也就是说,它看起来不像create_question甚至作为成员函数是有意义的;将它移动到文件的顶层(在任何类定义之外)可能就是你想要的;它修复了将其称为实例方法的需要,并且您不需要将self作为参数添加。