Testing 你能在scala中测试嵌套函数吗?

Testing 你能在scala中测试嵌套函数吗?,testing,scala,scalatest,Testing,Scala,Scalatest,有没有办法测试嵌套函数(最好是使用ScalaTest) 例如,是否有方法在以下代码中测试g(): def f() = { def g() = "a string!" g() + "– says g" } g在f之外是看不见的,所以我敢说不,至少没有反射 无论如何,我认为测试g会打破单元测试的概念,因为您不应该测试实现细节,而应该只测试公共API行为。如果f测试失败,则将错误跟踪到g中的错误是调试过程的一部分 如果测试g对您很重要,请将g定义为f之外的(受保护)方法。不过,这可能会破坏你

有没有办法测试嵌套函数(最好是使用ScalaTest)

例如,是否有方法在以下代码中测试
g()

def f() = {
  def g() = "a string!"
  g() + "– says g"
}

g
f
之外是看不见的,所以我敢说不,至少没有反射

无论如何,我认为测试
g
会打破单元测试的概念,因为您不应该测试实现细节,而应该只测试公共API行为。如果
f
测试失败,则将错误跟踪到
g
中的错误是调试过程的一部分

如果测试
g
对您很重要,请将
g
定义为
f
之外的(受保护)方法。不过,这可能会破坏你的设计


另一个想法是在原始代码中调用
g
之后再调用
assert
。这将在测试期间执行,如果属性不保持,则引发异常,从而导致测试失败。它也会出现在常规代码中,但可以被编译器删除,因为
assert
(及其伴随物)是可删除的(参见示例)。

您可以将方法私有化[包名]——仍然会稍微破坏设计,但将其私有化而不是保护

一般来说,我同意这样一个事实,即不应该测试私有方法,但是如果您维护的代码编写得很糟糕

private[example] def g() = "a string!"

def f() = {
  g() + "– says g"
}

现在在同一个包中测试(示例)可以测试g()

+1:我完全同意。因为您不能调用
g()
,所以不必担心它-只要
f()
行为正确,细节是什么都不重要。定义并调用
g
,或者仅仅在线执行代码,在概念上没有区别;这是一种与代码正确性无关的内部簿记措施
f
可以让独角兽神奇地计算结果;只要结果是正确的并且及时到达(并且没有可见的外部依赖关系),单元测试的工作就不是偷窥。@AndrzejDoyle但是如果我只是想加快开发(避免调试)并一步一步地测试所有东西。。。我认为这个问题类似于我测试我的代码。所以这些测试帮助我完善逻辑,即使它不是公共合同的一部分。在这种情况下,我的测试不是关于保证合同,而是开发辅助。我想我可以在函数之外开发函数,然后在完成逻辑后重新定位它。@Raphael测试一个代码单元如何打破单元测试的概念?单元测试的目的不是测试每一个代码单元吗?(与黑盒测试相反,黑盒测试只测试外部行为。)@aij公开设计上私有的函数可能会破坏一切。