2017-09-18 4 views
1

단위 테스트에서는 처음에 3 개의 객체 (기사)를 만듭니다. 테스트 완료 후 media_root 폴더에 3 개의 이미지가 있다는 것을 알게되었습니다.단위 테스트 후 이미지 파일을 삭제하는 방법은 무엇입니까?

질문 : 테스트 완료 후 생성 된 이미지를 삭제하는 방법은 무엇입니까?

P. 다음 코드를 사용하려고했지만 media_root 폴더를 삭제합니다.

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

참고 : 방법 test_article_form_validtest_article_crud의 문제.

tests.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 

답변

1

사용 tempfile 모듈의 TestCasesetUp() 방법 settings.MEDIA_ROOT로 사용,

from django.conf import settings 
import tempfile 

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

그러면 테스트가 끝나면 테스트에서 생성 된 파일이 자동으로 제거됩니다.

+0

그러나 OP는 디렉토리를 유지하려고하는데, 그 안에있는 파일을 제거한다고 생각합니다. – SiHa

+0

@SiHa 절대적으로 맞습니다! 내 테스트에서 만든 이미지 파일 만 삭제해야합니다. 폴더를 건드리지 마십시오. 다른 아이디어가 있습니까? –

+0

테스트의 요점은 실제 데이터베이스와 테스트에 영향을 미치지 않으면 서 특정 기능을 모방하는 것입니다. 그렇지 않습니까? 'tempfile' 모듈을 사용하면 실제 이미지 객체를 생성 할 필요가 없지만 모의 객체를 만들고 테스트를 한 후에 객체가 자동으로 삭제됩니다. 파일을 지우는 것에 관한 질문조차 발생하지 않고, 생성되고 파기 된 런타임에 생성 된 파일이 없습니다. – zaidfazil