2012-06-11 17 views
7

Soy nuevo en Scala (de Java) y me gusta desarrollar TDD/BDD. Entonces, antes de saber mucho sobre Scala, ya me he zambullido en Scalatest.Scala: configuración de prueba unitaria (¿usar modificadores de modificadores de acceso?)

Me pregunto cuál es la mejor estrategia de acceso para las pruebas unitarias, desde el punto de vista que desea probar tanto como sea posible.

Supongamos que tengo una clase World que quiero probar y un agente de clase que no debería saber todo sobre el mundo.

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 ... 
     } 
     } 
    } 
    } 
} 

Tenga en cuenta que estas declaraciones de paquetes no son sagradas para mí. Lo que realmente me gustaría es que WorldSpec sea algo así como un objeto complementario de World, para que pueda probar el efecto secundario.

Pensé que tal vez acceder a los modificadores de modificador ayudaría. Podría decir private[world] notForAgent, pero eso realmente es más acceso del que me gustaría. Lo que realmente me gustaría es algo así como private[this, test.WorldSpec] notForAgent, pero no creo que se permitan múltiples calificadores.

¿Qué harías para que esto sea comprobable? Alternativamente, ¿puedes indicar a dónde van mis pensamientos en la dirección incorrecta?

p.s. Sé que la frase "nunca pruebes a los soldados rasos". Pero también sé la opinión: "Las pruebas son más importantes que el código en sí. Altere los modificadores de acceso si es necesario para la prueba". Sin embargo, me gustaría evitar esa discusión en este hilo.

Respuesta

9

Si está preguntando "¿Cómo probar métodos privados?", Entonces ScalaTest realmente lo admite. Ver 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

Sí, sabía de eso. Sin embargo, el estado que quiero probar está en una var, no en un método. Aún así, su respuesta es realmente utilizable, porque aparentemente Scala también hace un método getter para un val privado. Entonces puedes hacer las pruebas de esta manera. ¿No habría una manera de permitir esto de una manera más natural sin embargo (como en el caso de un objeto complementario)? – qkrijger

+0

Hmm, no puedo votar su respuesta porque aún no tengo 15 reputación ... :( – qkrijger

+0

Ahora que estoy implementando algunas pruebas de esta manera, tengo que decir que el aire se torna un poco maloliente. Por un lado, esta prueba se rompe después de un refactorizador (que no es un gran problema, pero tampoco está limpio). Alguien tiene ideas sobre cómo mejorar la configuración, eso también sería bueno. Realmente me gusta la idea de una un objeto de prueba de unidad parecido a un compañero, pero no sabría cómo lograr algo así (si es posible). – qkrijger

Cuestiones relacionadas