Scala - 单元测试设置(使用访问修饰符限定符?)

qkr*_*ger 7 tdd unit-testing scope scala

我是Scala的新手(来自Java),我喜欢开发TDD/BDD.所以在了解Scala之前我已经潜入了Scalatest.

我想知道你认为什么是单元测试的良好访问策略,从你想要尽可能多的测试的角度来看.

假设我有一个我要测试的班级世界和一个不应该知道世界一切的班级代理.

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 ...
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这些包声明对我来说并不神圣.我真正想要的是,WorldSpec会像World的伴侣对象,因此它可以测试副作用.

我想也许访问修饰符限定符会有所帮助.我可以说private[world] notForAgent,但这确实比我想要的更多.我实际上想要的是private[this, test.WorldSpec] notForAgent,但我不认为允许多个限定符.

你会怎样做才能使这个可测试?或者,你能指出我的想法走向错误的方向吗?

ps我知道声明"永远不会测试私人".但我也知道"测试比代码本身更重要.如果测试需要更改访问修饰符".但是,我想在这个帖子中避免讨论.

agi*_*eel 9

如果你问"如何测试私有方法?",那么ScalaTest实际上支持这一点.看到这里.

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
}
Run Code Online (Sandbox Code Playgroud)