2017-12-15 24 views
1

매우 특정한 유형의 .csv 파일을 구문 분석하고 그 중에서 필드를 추출하는 CSV 파서 모듈이 있습니다. 이제이 모듈을 테스트하기 위해 몇 가지 단위 테스트를 작성합니다. 전통적으로 모듈을 테스트하기 위해 동일한 형식이지만 제한된 항목의 샘플 CSV 파일을 만든 다음이 파일을 모듈로 전달하고 출력을 확인합니다. 테스트 파일 자체에 의존성이 있기 때문에 분명히 좋지 않습니다.csv 파일 모의 방법

이 문제를 해결하는 올바른 방법은 무엇입니까? 나는 모의 모듈에 대해 읽었으며 모의 할 수있는 방법이 있습니다. 하지만 특정 파일을 어떻게 조롱 할 수 있는지 잘 모르겠습니다.

+1

테스트 파일은 괜찮습니다. – xs0

+0

내 말은, 그게 당신에게 어떤 불편을 줍니까? – xs0

+0

CSV 파일은 '쉼표로 구분 된 값'의 약자로, CSV 입력을 쉼표로 구분 된 값 (예 : "hello, world, welcome")으로 바꿀 수 있습니다. – AidanH

답변

2

테스트 데이터를 제공하지 않았으므로 임의의 예제가 문제를 해결할 수 있기를 바랍니다. 간단히 말해, 테스트 중에 임시 파일 객체를 만들고 싶지 않다면 (이는 합리적인 제약입니다. imo) StringIO을 사용하십시오. mock 모듈에는 중요한 진입 장벽이 있으므로, 사용하기 힘든 mock 능력을 필요로하지 않는다면 사용하면 안됩니다.

from io import StringIO 
from csv import reader # this should import your custom parser instead 

in_mem_csv = StringIO("""col1,col2,col3 
1,3,foo 
2,5,bar 
-1,7,baz""") # in python 2.7, put a 'u' before the test string 
test_reader = reader(in_mem_csv, delimiter=',', quotechar='|') 
for line in test_reader: 
    print(line) 
    # whatever you need to test to make sure the csv reader works correctly 

출력 :

['col1', 'col2', 'col3'] 
['1', '3', 'foo'] 
['2', '5', 'bar'] 
['-1', '7', 'baz'] 

편집 :

난 그냥 개인적으로 파일을 나타내는 트리플 문자열을 선호하는 서식 대체 문자열은 일반 문자열은 귀하의 경우 더 좋을 수 있습니다. 줄을 끊고 문자열 값을 편리하게 변경하지 않는 방법은이 예제를 참조하십시오.

in_mem_csv = StringIO(
    "col1,col2,col3\n" 
    "1,3,foo\n" 
    "2,5,bar\n" 
    "-1,7,baz\n" 
) 
+0

감사합니다. 이것은 내 요구 사항을 완벽하게 충족시킵니다. 나는 이것을 시험해보고 그것이 어떻게되는지 보게 될 것이다. – kronosjt

+0

이 방법이 효과가 있지만 유일한 단점은 in_mem_csv가 올바르게 들여 쓰기 될 수 없다는 것과 csv에 19 열이 있기 때문에 시각적으로 말하면 모든 것이 엉망입니다. – kronosjt

+0

@kronosjt 정상적인 문자열로 예제를 추가하고 형식을 어떻게 지정할 수 있습니까? 물론 이것은 훨씬 더 조밀하게 기록 될 수 있습니다. – Arne