나는 두 가지 해결책 모두 효과가있을 것이라고 생각합니다. 그러한 테스트를 유지하는 것이 오히려 문제이며, 둘 다 일부 외부 설정 (파일이 있고, 라이트 데이터가 있음)에 의존합니다.
주어진 테스트에 로컬 파일의 내용을 유지하는 가장 쉬운 방법은 조롱입니다. file:consult/1
원하는 값을 반환합니다.
두 가지 작업을 수행 할 수 있습니다.
우선, file:consult/1
을 테스트하지 않아야합니다. 그것은 표준 라이브러리의 일부이며 모든 라이트에서 작동한다고 가정 할 수 있습니다. 이 작업을 수행하는 대신이 파일에서 읽은 데이터를 사용하는 함수를 테스트해야합니다. 물론 "테스트에서 생성 된"데이터를 전달합니다. 데이터 소스와 구문 분석 (작동) 사이에 좋은 구분을 제공합니다. 그리고 나중에 file:consult
을 외부 서비스 또는 이와 유사한 것으로 대체하는 것이 더 간단 할 수 있습니다.
다른 것은 테스트 할 때 문제가있는 것은 당신에게 나쁜 냄새의 징후가되어야한다는 것입니다. 시스템을 재 설계하는 것에 대해 조금 생각할 수도 있습니다. 나는 당신이해야한다는 말은 아니지만 그런 문제는 정당화하는 좋은 지표입니다. 일부 기능 x를 테스트하고 프로덕션 및 기타 테스트 (파일 하나 또는 다른 읽기)에서 한 방향으로 작동하려면이 동작을 테스트 용으로 주입해야합니다. 또는 다른 말로 표현하자면,이 함수는 매개 변수가되도록 파일을 읽어야합니다. 여전히 생산 코드의 기능을 일부 "읽을 수있는 기본 파일을"하고 싶은 경우에, 당신은 당신의 테스트를 위해 더 이상 그것은 당신이 생산에 짧은 버전을 사용 할 수 있도록이
function_with_file_consult(A, B, C) ->
function_with_file_consult(A, B, C, "default_file.dat").
function_with_file_consult(A, B, C, File) ->
[ ... actual function logic ... ]
같은 것을 사용하고, 수 .
출처
2014-11-23 16:51:53
mpm
감사합니다. @ mpm! 그냥 명확히하기 위해 : 나는 파일을 테스트하지 않을 것이다 : consult/1 그 자체이다. 그리고 나의 어플리케이션은 생산과 테스트에서 같은 행동을 할 것이다. file : consult/1은 여러 도시에 대한 정보가 들어있는 데이터 파일을 읽고, 예를 들어 알 수없는 도시를 참조 할 때 자신의 함수를 테스트하려고합니다. – Gustavo
예, 알고 있습니다. 내 말은'file : consult'를 내부적으로 호출하는 함수를 테스트해서는 안된다는 것입니다. 물론 가능하다면.그리고 "당신은"다른 접근 방식이 더 유익 할 수도 있다고 생각할 가치가 있다는 것을 의미하지는 않습니다 (물론 그렇지 않을 수도 있음). – mpm