이제 두 테스트를 모두 실행하려고 하면 또 다른 문제를 발견할 수 있다. 첫 번째 테스트 후 서버를 중지하지 않아서 HTTP 포트가 계속 사용 중이기 때문에 두 번째 테스트는 실패한다.
문제를 좀 더 일반적인 방식으로 살펴보면, 리소스 누수 없이 제어된 방식으로 애플리케이션을 실행하고 싶다. 따라서 웹 서버와 웹 클라이언트를 생성하는 대신, 외부에서 이를 전달하고 시나리오를 실행한 후 서버를 닫아보자.
이를 위해 Unit을 결과로 돌려주는(부록 B Unit 참고) 단계들을 인자로 받는 runScenario 메서드를 정의한다. 각 단계는 부수 효과만 사용해 시스템을 수정하며, 결과를 반환하지 않는 대신, 문제가 있으면 오류를 발생시킨다. 이것이 테스트이고 기대하는 유일한 결과는 오류가 발생하지 않는 것뿐이기 때문에 이런 처리를 허용할 수 있다.
class ApplicationForAT(val client: HttpHandler, val server: AutoCloseable) { ➊
fun getToDoList(user: String, listName: String): ToDoList { ➋
val response = client(Request(Method.GET, "/todo/$user/$listName")) ➌