2009-09-21 3 views

답변

2

단위 테스트에서 코드를 "건너 뛰고"싶지는 않습니다. 그렇게하면 해당 영역에 대한 적용 범위를 얻을 수 없습니다. 외부 시스템에 모의 인터페이스를 제공하는 것이 훨씬 낫습니다. 따라서 나머지 코드는 예상대로 작동 할 수 있습니다. 을 사용할 수없는 외부 리소스를 처리 할 때 특히 중요합니다.은 네트워크 문제, 서비스 중단 또는 구성 오류가있을 때 S3이 될 수 있기 때문에 중요합니다.

로컬 파일 저장소 대신 테스트를 구성하는 대신 프로덕션 환경에서 Django S3 storage backend을 사용할 수도 있습니다.

1

업로드를 수행하는 모듈을 해킹하고 해당 모듈의 업로드 기능을 다른 기능으로 바꿀 수 있습니다. 이런 식으로 뭔가 :

foo.py :

def bar(): 
    return 42 

biz.py : 다시

import foo 
print foo.bar() # prints 42 
foo.bar = lambda: 37 
print foo.bar() # prints 37 

, 그것은 해킹, 그러나 이것은 유일한 곳이면 어디 필요 해요 그러한 기능이 당신을 위해 일할 수도 있습니다.

+0

rcoder의 답을 가장 좋은 해결책으로 받아 들였지만이 상황에서 "올바른"방법을 사용하는 것이 중요하지 않으므로 rcoder의 대답이이 솔루션을 사용하여 끝났습니다. –

+0

걱정하지 마라, 그의 대답은 나의 것보다 낫다 :) – Thomas

0

테스트를 위해 함수를 건너 뛰지 마십시오.

실물과 같이 실행하고 싶지 않은 것에 대한 모의 구현을 제공합니다.

먼저, S3 업 로더를 애플리케이션에 필요한 API가있는 별도의 클래스로 만들어 테스트하도록 설계했습니다.

그런 다음 동일한 API를 사용하여이 클래스의 모의 버전을 작성합니다. 그것이 한 것은 기록 된 것입니다.

마지막으로 실제 S3 업 로더 대신 모의 개체를 장치 테스트에 연결해야합니다.

Django 응용 프로그램은 단위 테스트에서 변경 내용을 "주입"한 것 외에는 변경해서는 안됩니다. 업로드

import the_uploader 
import mock_uploader 
from django.conf import settings 
uploadClass = eval(settings.S3_UPLOAD_CLASS_NAME) 
uploader= uploadClass(...) 

을 수행

귀하의 views.py 지금, 당신은 두 settings.py 파일을 제공합니다. 기본 settings.py에는 적절한 업 로더 클래스 이름이 있습니다.

테스트를 위해 test_settings.py이 있습니다.

import settings.py 
S3_UPLOAD_CLASS_NAME = "mock_uploader.mock_upload_class" 

이렇게하면 실제로 모든 것을 테스트 할 수 있습니다.

+0

이 경우, 그것은 책임의 상당히 자연 분리를 만든다. 그러나 주 코드의 구조가 단 하나의 가능한 구현을 가진 인터페이스에 의해 어지럽 혀진 코드를 보았습니다. 단위 테스트를 행복하게 만드는 것을 제외하고는 아무런 목적도 없었습니다. – Thomas

+0

@ 토마스 : 파이썬에서? 또는 Java/C#에서 추가 선언적 항목이 필요한 곳은 어디입니까? –

관련 문제