5

在单元测试中,我在开始时创建了 3 个对象(文章)。测试完成后,我注意到media_root文件夹中有 3 张图像。

问题:如何删除测试完成后创建的图像?

PS我尝试使用下一个代码,但它删除了media_root文件夹。

def tearDown(self):
        rmtree(settings.MEDIA_ROOT, ignore_errors=True)

注意:方法test_article_form_validtest_article_crud.

测试.py:

class ArticleTestCase(TestCase):
    def setUp(self):  
        self.image = open(os.path.join(BASE_DIR, 'static/images/tests/image.jpg'), "r")

    def test_article_form_valid(self):
        data = {
            'head': 'TEXT',
        }
        files_data = {
            'image': SimpleUploadedFile(
                name=self.image.name,
                content=self.image.read(),
                content_type='image/jpeg'
            )
        }
        form = ArticleForm(data=data, files=files_data)
        self.assertTrue(form.is_valid())  <-- ERROR

    def test_article_crud(self):
        response = self.client.get(reverse("article:article_create"))
        self.assertEquals(response.status_code, 200)
        response = self.client.post(
            reverse("article:article_create"),
            data={
                'head': 'TEST',
                'image': self.image
            },
            follow=True,
            format='multipart'
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Article.objects.all().count(), 1) <-- ERROR

    def test_article_view(self):
        first_article = Article.objects.create(
            pk=150,
            head='First',
            image=SimpleUploadedFile(
                name=self.image.name,
                content=self.image.read(),
                content_type='image/jpeg'
            )
        )

        second_article = Article.objects.create(
            pk=160,
            head='Second',
            image=SimpleUploadedFile(
                name=self.image.name,
                content=self.image.read(),
                content_type='image/jpeg'
            )
        )

        third_article = Article.objects.create(
            pk=170,
            head='Third',
            image=SimpleUploadedFile(
                name=self.image.name,
                content=self.image.read(),
                content_type='image/jpeg'
            )
        )
        [***]

错误

FAIL: test_article_crud (article.tests.ArticleTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/nurzhan/CA/article/tests.py", line 55, in test_article_crud
    self.assertEqual(Article.objects.all().count(), 1)
AssertionError: 0 != 1

======================================================================
FAIL: test_article_form_valid (article.tests.ArticleTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/nurzhan/CA/article/tests.py", line 117, in test_article_form_valid
    self.assertTrue(form.is_valid())
AssertionError: False is not true
4

3 回答 3

7

我找到了这篇文章,它对我有用

import shutil, tempfile
from django.test import TestCase, override_settings

MEDIA_ROOT = tempfile.mkdtemp()

@override_settings(MEDIA_ROOT=MEDIA_ROOT)
class MeuPetTest(TestCase):
    @classmethod
    def tearDownClass(cls): 
        shutil.rmtree(MEDIA_ROOT, ignore_errors=True)
        super().tearDownClass()
于 2019-03-13T23:08:52.233 回答
0

tempfile在python中使用模块,settings.MEDIA_ROOTTestCase setUp()方法中使用它,

from django.conf import settings
import tempfile

def setUp(self):
    settings.MEDIA_ROOT = tempfile.mkdtemp()

然后,测试中创建的文件将在测试完成时自动删除。

更新

那么,测试中创建的文件不会在测试结束时自动删除,所以测试结束后不要忘记删除临时目录。

于 2017-09-18T07:08:15.847 回答
0

对我来说最好的解决方案是编写一个删除图像并将其添加到测试类 tearDown 方法中的函数。

def delete_test_image():
    images_path = os.path.join(PROJECT_PATH, 'media/images')
    files = [i for i in os.listdir(images_path) 
             if os.path.isfile(os.path.join(images_path, i))
             and i.startswith('test_image_')]

    for file in files:
        os.remove(os.path.join(images_path, file))
于 2021-07-18T20:24:12.157 回答