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

发布于 2024-10-22 05:42:24 字数 168 浏览 1 评论 0 原文

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

例如,有没有办法在下面的代码中测试 g()

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

Is there any way to test a nested function (ideally with ScalaTest)?

For example, is there a way to test g() in the below code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

巷子口的你 2024-10-29 05:42:24

gf 之外不可见,所以我敢说不,至少在没有反射的情况下不可见。

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

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

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

g is not visible outside of f, so I daresay no, at least not without reflection.

I think testing g would break the concept of unit testing, anyway, because you should never test implementation details but only public API behaviour. Tracking an error to a mistake in g is part of the debugging process if tests for f fail.

If testing g is important for you, define g as (protected) method outside of f. That might break your design, though.

Another idea would be to put calls to assert after the call of g in the original code. This will be executed during tests and raise an exception if the property does not hold, causing the test to fail. It will be there in regular code, too, but can be removed by the compiler as assert (and companions) are elidible (see e.g. here).

苦妄 2024-10-29 05:42:24

您可以将方法设为 private[package-name] - 仍然会有点破坏设计,但保持其私有而不是受保护。

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

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

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

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

You could make method private[package-name] - still breaks design a bit, but keeps it private instead of protected.

Generally I agree with the fact that one should not test private methods, but if you are maintaining poorly written code...

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

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

Now test in same package (example) could test g()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文