Django测试用户模型失败但它在浏览器

时间:2017-12-18 01:56:34

标签: python django unit-testing

我是测试的新手,我正在尝试运行以下测试,但是我收到 404断言错误,因为尝试撤消网址的方法无法找到类别已在 setUp 方法中创建。我可以使用超级用户在浏览器中创建类别,没有任何问题,并且网址响应为200状态。你能帮我理解我做错了吗?

测试

from __future__ import unicode_literals
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.contrib.auth.models import User
from cataloger.models import Category

class CatalogerCategoriesTests(TestCase):

    def setUp(self):
       tom = User.objects.create_user(username="tom", password="1234567")
       Category.objects.create(name="cell phone", 
                            description="current cell phone types in the market.",
                            created_by=tom)

    def test_category_page_success_status_code(self):
       url = reverse('category_items', kwargs={'pk': 1})
       response = self.client.get(url)
       self.assertEquals(response.status_code, 200)

故障:

Traceback (most recent call last):
  File "/home/ubuntu/workspace/cataloger/tests_categories.py", line 48, in test_category_page_success_status_code
    self.assertEquals(response.status_code, 200)
AssertionError: 404 != 200

型号:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import User


class Category(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=300)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)
    created_by = models.ForeignKey(User, related_name="categories")

查看:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from cataloger.models import Category

def category_items(request, pk):
    category = get_object_or_404(Category, pk=pk)
    return render(request, 'category_items.html', {'category': category})

网址:

from django.conf.urls import url
from . import views

urlpatterns = [
        url(r'^cataloger/$', views.cataloger, name='cataloger'),
        url(r'^cataloger/categories/(?P<pk>\d+)/$', views.category_items, name='category_items')
    ]

2 个答案:

答案 0 :(得分:2)

对象的pk可能并不总是1,具体取决于测试结构和数据库。应明确使用pk实例的Category

from __future__ import unicode_literals
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.contrib.auth.models import User
from cataloger.models import Category

class CatalogerCategoriesTests(TestCase):
    def setUp(self):
        tom = User.objects.create_user(username="tom", password="1234567")
        self.category = Category.objects.create(
            name="cell phone", 
            description="current cell phone types in the market.",
            created_by=tom
        )

    def test_category_page_success_status_code(self):
        url = reverse('category_items', kwargs={'pk': self.category.pk})
        response = self.client.get(url)
        self.assertEquals(response.status_code, 200)

答案 1 :(得分:1)

@Stuart Dines explains very well. You should match pk for urls.

Or if you just want to know that model instance created well, just try self.assertIsInstance(...)

def setUp(self):
   tom = User.objects.create_user(username="tom", password="1234567")
   category = Category.objects.create(name="cell phone", 
                        description="current cell phone types in the market.",
                        created_by=tom)

def test_if_category_instance_made(self):
    self.assertIsInstance(self.category, Category)

Also I recommend model mommy for easy testing django models. It automatically generate random model (also put test data possible) and make really easy to testing your model!

This is example using model_mommy for your test code

from model_mommy import mommy

class CatalogerCategoriesTests(TestCase):

    def setUp(self):
        self.tom = mommy.make("User")
        self.category = mommy.make("Category", user=self.user)

    def test_if_category_instance_made(self):
        self.assertIsInstance(self.category, Category)

    def test_category_page_success_status_code(self):
        url = reverse('category_items', kwargs={'pk': self.category.pk})
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)