2012-06-11 8 views
7

저는 스칼라를 처음 접했고 (자바로부터) TDD/BDD를 개발하고 싶습니다. 그래서 스칼라에 대해 많이 알기 전에 이미 스칼라 테스트로 뛰어 들었습니다.스칼라 - 유닛 테스트 설정 (액세스 한정자 한정자 사용)

가능한 한 테스트하려는 관점에서 단위 테스트를위한 좋은 액세스 전략이라고 생각하는 것이 궁금합니다.

내가 테스트하고 싶은 클래스 월드가 있고 세계에 대한 모든 것을 알아야하는 클래스 에이전트가 있다고 가정합니다.

package program { 
    package world { 
    class World { 
     private var notForAgent 
     def forAgentDuringActing 
     // forAgentDuringActing has an important side effect in notForAgent 
    } 
    } 

    package agent { 
    class Agent 
    // would call World.forAgentDuringActing 
    } 

    package world.test { 
    class WorldSpec extends FunSpec { 
     describe("The world") { 
     it("should have side-effect behaviour when the agent acts on it") { 
      // ... the test ... 
     } 
     } 
    } 
    } 
} 

이 패키지 선언은 나에게 신성하지 않습니다. 제가 정말로 원했던 것은 WorldSpec이 World의 동반 대상과 같아서 부작용을 테스트 할 수 있다는 것입니다.

아마도 수정 자 한정자가 도움이 될 것으로 생각했습니다. 내가 private[world] notForAgent라고 말할 수는 있지만, 실제로는 내가 원하는 것보다 더 많은 접근이 있습니다. 내가 실제로 원하는 것은 private[this, test.WorldSpec] notForAgent과 같지만 여러 한정자가 허용되지 않는다고 생각합니다.

이 항목을 테스트 할 수 있도록하려면 어떻게해야합니까? 또는 내 생각이 잘못된 방향으로가는 곳을 나타낼 수 있습니까?

p.s. 나는 "진술하지 않는다"라는 진술을 안다. 하지만 "테스트가 코드 자체보다 중요합니다. 액세스 수정자를 테스트해야하는 경우 변경하십시오"라는 의견도 있습니다. 그러나이 스레드에서는이 토론을 피하고 싶습니다.

답변

9

"개인 메서드를 테스트하는 방법"을 묻는다면 ScalaTest는 실제로 이것을 지원합니다. here을 참조하십시오.

class C { 
    private def m(x: Int) = x 
} 

class CTests extends /*any test suite you like*/ with PrivateMethodTester { 
    val decoratedM = PrivateMethod[Int]('m) 
    val c = new C 
    val actual = c invokePrivate decoratedM(4711) 
    val expected = 4711 
    actual should be(expected) // this line depends on the test suite you've chosen 
} 
+0

예, 알고 있습니다. 그러나 테스트하고 싶은 상태는 메소드가 아니라 var에 있습니다. 스칼라는 프라이빗 val에 대한 getter 메소드를 만들기 때문에 실제로는 사용할 수있다. 이렇게하면이 방법으로 테스트를 수행 할 수 있습니다. 그러나 더 자연스러운 방법으로 허용 할 방법이 없습니까 (예 : 동반자 개체의 경우)? – qkrijger

+0

흠, 나는 아직 15 평판이 없기 때문에 답변을 투표 할 수 없습니다. ... : ( – qkrijger

+0

나는이 방식으로 몇 가지 테스트를 구현 했으므로 공기가 약간 코드 - 냄새가 날 것이라고 말해야합니다. 이 테스트는 리팩터링 후에 나옵니다. (큰 문제는 아니지만 깨끗하지도 않습니다.) 누군가가 설정을 개선하는 방법에 대한 아이디어를 가지고 있습니다. 좋을 것 같습니다. 동반자와 같은 단위 테스트 객체,하지만 그 (가능한 경우) 같은 것을 달성하는 방법을 모르겠다. – qkrijger