Я довольно новичок в django и пишу тесты.В настоящее время я работаю над проектом, который имеет две модели, Project и Technologies.Модели проекта имеют много-много взаимосвязи с технологической моделью.У меня есть представление, которое переопределяет метод get_queryset.В моем отчете о покрытии этот метод - моя единственная мисс.Я ищу руководство о том, как написать модульный тест для этого метода.Спасибо, что нашли время ответить на мой вопрос.
models.py
from django.db import models
from django.template.defaultfilters import slugify
from django.urls import reverse
class Technologies(models.Model):
name = models.CharField(max_length=64, unique=True)
slug = models.SlugField()
def __str__(self):
return self.slug
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Technologies, self).save(*args, **kwargs)
class Project(models.Model):
title = models.CharField(max_length=64)
description = models.CharField(max_length=128)
repo = models.URLField()
slug = models.SlugField()
image = models.ImageField(
upload_to='project_images',
default='project_images/default_project.png')
technologies = models.ManyToManyField(Technologies)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Project, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse("projects:detail", kwargs={"slug": self.slug})
views.py
from django.views.generic import DetailView, ListView
from .models import Project
class ProjectsListView(ListView):
model = Project
class ProjectDetailView(DetailView):
model = Project
class TechnologiesListView(ListView):
model = Project
allow_empty = False # If list is empty 404
def get_queryset(self):
return Project.objects.filter(technologies__slug=self.kwargs['slug'])
urls.py
from django.urls import path
from . import views
app_name = "projects"
urlpatterns = [
path('', view=views.ProjectsListView.as_view(), name='list'),
path('<slug>', view=views.ProjectDetailView.as_view(), name='detail'),
path('tagged/<slug>', view=views.TechnologiesListView.as_view(), name='tech_list'),
]
поэтому мой вопрос с этим методом:
def get_queryset(self):
return Project.objects.filter(technologies__slug=self.kwargs['slug'])
test_views.py
import pytest
from django.test import RequestFactory
from django.urls import reverse
from mixer.backend.django import mixer
from projects.views import ProjectDetailView, ProjectsListView, TechnologiesListView
@pytest.mark.django_db
class TestProjectViews:
def test_projects_by_technologies_view(self):
tech = mixer.blend('projects.Technologies')
path = reverse('projects:tech_list', kwargs={'slug': tech.slug})
request = RequestFactory().get(path)
response = TechnologiesListView.as_view()(request)
assert response.status_code == 200, 'Should be status code 200'
Когда я запускаю этот тест, я получаю:
def get_queryset(self):
> return Project.objects.filter(technologies__slug=self.kwargs['slug'])
E KeyError: 'slug'
Isэто потому что kwargs не в запросе, генерируемом из фабрики запросов?Или это проблема с базой данных?Я очень растерялся и запутался в этом и был бы очень признателен за любые мудрые слова.