(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Lập trình Web: Python: Django: Chương trình thăm dò ý kiến, phần 4

13. Chạy test

Chúng ta sẽ chạy test cho các chức năng dưới đây:

1) Thử nghiệm mô hình câu hỏi

  1. Câu hỏi tương lai không phải là câu hỏi xuất bản gần đây

    Tạo một câu hỏi có ngày xuất bản lớn hơn thời điểm hiện tại. Đảm bảo phương thức was_published_recently() của nó phải trả về False.

  2. Câu hỏi cũ hơn 1 ngày không phải là câu hỏi xuất bản gần đây

    Đảm bảo phương thức was_published_recently() của câu hỏi cũ hơn 1 ngày phải trả về False.

  3. Khẳng định câu hỏi xuất bản trong vòng 1 ngày là câu hỏi gần đây

    Test câu hỏi xuất bản cách đây 23 giờ, 59 phút, 59 giây. Đảm bảo phương thức was_published_recently() của nó phải trả về True.

2) Thử nghiệm view “index”

  1. Khi không có câu hỏi

    Khi không có câu hỏi, view phải thông báo “No polls are available.”. Danh sách các câu hỏi gần đây trong ngữ cảnh đáp ứng phải là rỗng. Tuy nhiên mã đáp ứng phải là 200 để cho thấy view hoạt động được.

  2. Câu hỏi quá khứ

    Đảm bảo câu hỏi trước đây được trình bày trên trang index. Trang index không giới hạn ngày xuất bản đã qua. Một câu hỏi được trình bày nếu nó “đã xuất bản” và nằm trong 5 câu hỏi có ngày xuất bản gần đây nhất. Ngày xuất bản của một câu hỏi không hoàn toàn giống với thời điểm tự động gán khi chúng ta đăng một post thông thường. Nó có thể được đặt trong trang quản trị hoặc sử dụng API, và có thể là một ngày của tương lai. Như vậy, một câu hỏi có ngày xuất bản lớn hơn thời điểm hiện tại có thể được gọi là câu hỏi tương lai và chưa xuất bản đối với khách bình chọn vì nó không xuất hiện trên trang index. Đây cũng chính là vấn đề của mục test tiếp theo.

  3. Câu hỏi tương lai

    Đảm bảo câu hỏi tương lai không xuất hiện trên trang index.

  4. Câu hỏi tương lai và câu hỏi quá khứ

    Tạo hai câu hỏi, một câu hỏi tương lai và một câu hỏi quá khứ. Đảm bảo chỉ câu hỏi quá khứ được trình bày trên trang index.

  5. Hai câu hỏi quá khứ

    Tạo hai câu hỏi quá khứ. Đảm bảo cả hai được trình bày trên trang index.

3) Thử nghiệm view “detail”

  1. Câu hỏi tương lai

    Đảm bảo view “detail” của câu hỏi tương lai trả về mã 404 (không thấy).

  2. Câu hỏi quá khứ

    Đảm bảo view “detail” của câu hỏi quá khứ trình bày văn bản của câu hỏi.

Bây giờ chúng ta sẽ thực hiện các hoạt động test nêu trên với mã nguồn dưới đây. Bạn soạn thảo tệp polls/tests.py với nội dung sau:

import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question
from django.urls import reverse

class QuestionModelTests(TestCase):

    def test_was_published_recently_with_future_question(self):
        """
        was_published_recently() returns 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)

    def test_was_published_recently_with_old_question(self):
        """
        was_published_recently() returns False for questions whose pub_date
        is older than 1 day.
        """
        time = timezone.now() - datetime.timedelta(days=1, seconds=1)
        old_question = Question(pub_date=time)
        self.assertIs(old_question.was_published_recently(), False)

    def test_was_published_recently_with_recent_question(self):
        """
        was_published_recently() returns True for questions whose pub_date
        is within the last day.
        """
        time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59)
        recent_question = Question(pub_date=time)
        self.assertIs(recent_question.was_published_recently(), True)

def create_question(question_text, days):
    """
    Create 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 QuestionIndexViewTests(TestCase):

    def test_no_questions(self):
        """
        If no questions exist, an appropriate message is 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_past_question(self):
        """
        Questions with a pub_date in the past are 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_future_question(self):
        """
        Questions with a pub_date in the future aren't 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.")
        self.assertQuerysetEqual(response.context['latest_question_list'], [])

    def test_future_question_and_past_question(self):
        """
        Even if both past and future questions exist, only past questions
        are 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_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 QuestionDetailViewTests(TestCase):

    def test_future_question(self):
        """
        The detail view of a question with a pub_date in the future
        returns a 404 not found.
        """
        future_question = create_question(question_text='Future question.', days=5)
        url = reverse('polls:detail', args=(future_question.id,))
        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)

    def test_past_question(self):
        """
        The detail view of a question with a pub_date in the past
        displays the question's text.
        """
        past_question = create_question(question_text='Past Question.', days=-5)
        url = reverse('polls:detail', args=(past_question.id,))
        response = self.client.get(url)
        self.assertContains(response, past_question.question_text)

Chạy test:

python manage.py test polls

Mỗi khi chạy, chương trình test tự động tạo ra cơ sở dữ liệu test_django_mysite và làm việc trên đó. Cho nên kết quả test không phụ thuộc cơ sở dữ liệu chính. Chương trình test cũng tự động hủy cơ sở dữ liệu test_django_mysite sau khi test xong.

Advertisements

Gửi phản hồi

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: