2015-12-18 57 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作爲參數添加。