문제

Scala에서 테스트하기위한 멋진 라이브러리가 있습니다 (명세서, Scalatest, 스칼라 크). 그러나 Scala의 강력한 유형 시스템을 사용하면 Scala에서 API의 중요한 부분이 정적으로 표현되며, 일반적으로 컴파일러에 의해 바람직하지 않거나 허용되지 않은 일부 행동의 형태로 표현됩니다.

그렇다면 라이브러리 나 다른 API를 설계 할 때 컴파일러가 무언가를 방지하는지 테스트하는 가장 좋은 방법은 무엇입니까? 고려할 수없는 코드를 댓글을 달아서 확인하기 위해 무의미해야합니다.

고안된 예제 테스트 목록 :

val list: List[Int] = List(1, 2, 3)
// should not compile
// list.add("Chicka-Chicka-Boom-Boom")

기존 테스트 라이브러리 중 하나가 이와 같은 케이스를 처리합니까? 사람들이 그 효과를 사용하는 접근법이 있습니까?

내가 고려했던 접근법은 코드를 트리플 쿼트 문자열 또는 XML 요소에 포함시키고 테스트에서 컴파일러를 호출하는 것이 었습니다. 다음과 같은 것을 보이는 코드를 호출합니다.

should {
  notCompile(<code>
    val list: List[Int] = List(1, 2, 3)
    list.add("Chicka-Chicka-Boom-Boom")
  </code>)
}

또는 an의 선을 따라 무언가 예상하다-유형 스크립트는 통역사를 호출했습니다.

도움이 되었습니까?

해결책

일부 코드 스 니펫을 실행하고 통역사의 결과를 확인하는 일부 사양을 만들었습니다.

당신은 그것을 볼 수 있습니다 짧은 발췌 특성. 아이디어는 일부 org.specs.util.property [Snippet]에 저장하는 것입니다.

val it: Property[Snippet] = Property(Snippet(""))
"import scala.collection.List" prelude it // will be prepended to any code in the it snippet
"val list: List[Int] = List(1, 2, 3)" snip it // snip some code (keeping the prelude)
"list.add("Chicka-Chicka-Boom-Boom")" add it  // add some code to the previously snipped code. A new snip would remove the previous code (except the prelude)

 execute(it) must include("error: value add is not a member of List[Int]") // check the interpreter output

이 접근법에서 찾은 주요 단점은 통역사의 속도가 느려졌습니다. 나는 이것이 어떻게 이루어질 수 있는지 아직 모른다.

에릭.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top