시뮬레이션 스타일 테스트를 사용하여 전체 응용 프로그램이 올바르게 작동하는지 확인합니다. 핵심 Clojure 테스트 라이브러리는 Leiningen을 통해 실행되는 테스트에 사용됩니다. -main
함수가 실행되기 때문에 나중에 논리 내에서 사용할 기호를 정의합니다. 문제는 어떤 실수로 -main
테스트에서 생성되었지만 현재 -main
테스트에서 정의 된 심볼을 사용하더라도 여전히 값이 있다는 것입니다. 기호가 정의되지 않은 오류가 발생할 것으로 예상되지만 내 테스트 환경이 deftest
실행 사이에 어떻게 든 공유 상태 인 것으로 보입니다. 이 문제를 어떻게 처리 할 수 있습니까? 편의 지향적 인 모든 기호 정의를 let
문으로 옮깁니 까?Clojure 테스트간에 기호 오염을 방지하려면 어떻게해야합니까?
3
A
답변
5
def
- 함수 내에 전역 변수를 넣는 것은 일반적으로 나쁜 습관으로 간주되어 대신 제안하는대로 let
으로 충분합니다.
그러나 스냅 샷을 네임 스페이스의 매핑으로 캡처 할 수 있습니다.
(def ns-snapshot (ns-map *ns*))
그래서 후를
인턴 문자(def foo 1)
(def bar 2)
당신은 추가를 확인할 수 있습니다
(reduce dissoc (ns-map *ns*) (keys ns-snapshot))
;=> {bar #'so.core/bar, foo #'so.core/foo}
그리고
(doseq [[k v] (reduce dissoc (ns-map *ns*) (keys ns-snapshot))] (ns-unmap *ns* k))
그래서 당신은 얻을 것이다 그들에게 않은지도 원하는 미정의 에러
foo ;=> CompilerException ... Unable to resolve symbol: foo in this context
추가 기호 문제를 해결하는 데 유용한 정보입니다. 따라서 심볼을 정의하는 이유 중 하나는 각 심볼이 정의되기 전과 후에 로깅 메시지를 갖게하기 위해서입니다. 이걸 작동 시키려면'let' 문을 중첩해야합니까? 아니면 더 나은 방법을 생각할 수 있습니까? – user1559027
@ user1559027 어쩌면 당신이 말하는 것에 대한 코드 예제로 새로운 질문을 게시 할 수 있습니까? 나는 당신이 그 간단한 설명에서 무엇을하고 있는지 이해하지 못합니다. –