Search code examples
djangodjango-viewsdjango-templatesdjango-testingdjango-tests

AssertionError: No templates used to render the response


I solved the problem while writing this question but I wanted to post it so maybe someone needs this answer


Hello my friends. i am new to django testing. while i'm testing my views i faced this error in some views.

This is my views.py:

def all_programs(request):
    programs = Program.objects.all()
    return render(request, 'orders/all_programs.html', {'programs': programs})


def checkout(request, slug):
    if request.method == 'POST':
        # get data from form and save it

    program = get_object_or_404(Program, slug=slug)
    dates = ProgramDate.objects.filter(program=program)
    return render(request, 'orders/checkout.html', {'program': program, 'dates': dates})

This is urls.py:

from django.urls import path
from django.views.generic import RedirectView
from .views import *

app_name = 'orders'

urlpatterns = [
    path('', RedirectView.as_view(url='https://www.another-website.net')),
    path('tests/', all_programs, name='all_programs'),
    path('checkout/<str:slug>/', checkout, name='checkout'),
    path('checkout/return_page/', ReturnPage.as_view(), name='return_page'),
]

And this is test_views.py:

from django.test import TestCase
from django.shortcuts import reverse


class TestViews(TestCase):
    
    def test_all_programs(self):
        response = self.client.get(reverse('orders:all_programs'))
        self.assertTemplateUsed(response, 'orders/all_programs.html')

    def test_checkout(self):    # error id here
        response = self.client.get(reverse('orders:all_programs', kwargs={'slug': 'test'}))     # I tried this  
        # response = self.client.get('http://127.0.0.1:8000/checkout/test/')    #and this
        self.assertTemplateUsed(response, 'orders/checkout.html')


Solution

  • The solution in this case is:

    The test in Django does not use the default database but rather creates its own database that does not have any records (I completely forgot that), so you must create records before you start tests that relate to the database. in this case i must create new program before test:

    class TestViews(TestCase):
    
        _program = {
            'name': 'test_program',
            'price': 1000,
            'abbreviation': 'test',
            'description': 'test_program',
            'slug': 'test_program',
            'id_from_zoho': 1000,
        }
    
    
        def test_checkout(self):
            program = Program(**self._program)
            program.save()
            response = self.client.get(reverse('orders:checkout', kwargs={'slug': program.slug}))
            self.assertTemplateUsed(response, 'orders/checkout.html')