2

我正在尝试写给unit-testcreate function的 Django 项目。这是我第一次创建单元测试的经验。为什么我不能创建新数据?从错误中我了解到测试数据库中没有文章。我哪里做错了?

测试.py:

class ArticleViewTestCase(TestCase):
    def setUp(self):
        self.user = User.objects.create(
            username='user',
            email='user@gmail.com',
            password='password'
        )
        self.client = Client()
    
    def test_article_create(self):
        self.assertTrue(self.user)
        self.client.login(username='user', password='password')
        response = self.client.get('/article/create/')
        self.assertEquals(response.status_code, 200)

        with open('/home/nurzhan/Downloads/planet.jpg', 'rb') as image:
            imageStringIO = StringIO(image.read()) # <-- ERROR HERE

        response = self.client.post(
            '/article/create/',
            content_type='multipart/form-data',
            data={
                'head': 'TEST',
                'opt_head': 'TEST',
                'body': 'TEST',
                'location': 1,
                'public': True,
                'idx': 0,
                'image': (imageStringIO, 'image.jpg')
            },
            follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Article.objects.all().count(), 1)

错误:

Traceback (most recent call last):
  File "/home/nurzhan/CA/article/tests.py", line 26, in test_article_create
    imageStringIO = StringIO(image.read())
TypeError: 'module' object is not callable
4

3 回答 3

2

您可以在测试中覆盖form_invalid并检查它的数据

class ArticleCreateView(CreateView):
    # YOUR code here

   def form_invalid(self, form):
        data = {'status': False, 'errors': form.errors}
        return JsonResponse(data, , status=500)

在测试方法中:

with open('/home/nurzhan/Downloads/planet.jpg', 'rb') as image:
    response = self.client.post('/article/create/',
        data={
            'head': 'TEST',
            'opt_head': 'TEST',
            'body': 'TEST',
            'location': 1,
            'public': True,
            'idx': 0,
            'image': image
        },
        follow=True, format='multipart'
     )
于 2017-09-12T09:21:42.607 回答
1

单元测试时,Django在每次测试结束时清空数据库,因此每次测试都从一个空数据库开始。在您的测试开始时很可能没有用户存在,这意味着登录失败。您应该将测试更改为以下内容:

from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User

class ArticleViewTestCase(TestCase):

    def test_article_create(self):
        User.objects.create(username='alice', password=make_password('topsecret'))
        logged_in = self.client.login(username='alice', password="topsecret")
        self.assertTrue(logged_in)
        # Continue your test here

在掌握了这一点之后,您最终会希望将用户创建移至该setUp()方法。

于 2017-09-12T06:43:51.930 回答
0

在您的测试代码中插入 PDB 测试工具:

# Below response = self.client.get('/article/create/')
import pdb;pdb.set_trace()

并检查response.data是否会为您解答那里发生的事情:)

测试代码的一些提示:

如果你不需要检查用户登录数据然后使用 self.client.force_login(self.user)你只需要给出用户对象并且它是明确的。当你有很多 https 方法要测试但它是可选的 - 只建议

尝试不要len()在你的对象上使用 db 只是 Article.objects.all().count()用来获取对象的数量然后你不需要使用len()

articles_amount = Article.objects.all().count()
self.assertEqual(articles_amount, 1)
于 2017-09-12T06:56:02.240 回答