модульный тест get_absolute_url django - PullRequest
0 голосов
/ 25 ноября 2018

Я довольно новичок в 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 не в запросе, генерируемом из фабрики запросов?Или это проблема с базой данных?Я очень растерялся и запутался в этом и был бы очень признателен за любые мудрые слова.

1 Ответ

0 голосов
/ 25 ноября 2018

Удивительно, как написание вашего вопроса может немного лучше разобраться.Вот мое решение.

def test_projects_by_technologies_view(self):
self.tech = mixer.blend('projects.Technologies')
self.proj = mixer.blend(Project, technologies=self.tech)
self.path = reverse('projects:tech_list', kwargs={'slug': self.tech.slug})
self.request = RequestFactory().get(self.path)
self.response = TechnologiesListView.as_view()(self.request, slug=self.tech.slug)
assert self.response.status_code == 200, 'Should be status code 200'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...