1

在 CakePHP 中,我有一个非常简单的测试,但是每当我在模型中使用 $this->log() 时,即使我的测试通过了,在运行测试时也会在 CLI 中得到非常讨厌的输出。当出现真正的错误时,这使得调试变得更加困难,我必须尝试过滤掉日志输出以找到真正的错误。

例子:

//单元测试

public function testTesting() {
    $this->Ad->testing();
    $this->assertTrue(true);
}

//正在测试的模型方法

public function testing() {
    $this->log('sweet nothings');
}

CLI 中的输出:http: //cl.ly/image/3R3a040c3S46

如您所见,我的测试通过了,但我得到了详细的日志输出。我正在使用的命令是cake test app Model/ModelName

如何使 CLI 运行器的输出不那么冗长。使用 -q 或 --quiet 得到错误unrecognized option --quiet

任何帮助表示赞赏!:)

4

1 回答 1

1

您的最小测试用例很好地说明了一些方面:

  1. $this->assertTrue(true)只是为了断言某事而使用。
  2. 您测试过的函数会进行一些日志记录,但未经过测试。
  3. 您的测试运行充满了日志输出。

让我们首先解决第三点:无论您使用什么记录器,它都应该能够被配置为将日志消息放在某个地方。目前看来,记录器只是回显消息。您可能还可以登录文件或发送邮件。或者什么都不做。因此,理论上您应该能够通过仅为测试应用配置来使日志输出静音。

第二点:每当您使记录器输出静音时,您都无法验证记录是否实际正常工作。

日志记录实际上有多种形式,其中一种是帮助开发人员在出现错误时调试应用程序,另一种是为非常重要的应用程序事务留下审计线索。审计跟踪日志是类行为的重要组成部分,必须对其进行测试,而调试辅助只是类的一个插件,即使不发生也不会损害应用程序。

所以问题是:这个日志记录在你的应用程序中做什么?它只是一种调试辅助工具,还是应用程序行为的重要组成部分?

如果它是至关重要的,那么它必须进行测试。最好通过注入记录器的模拟对象来完成测试,并断言对该log()函数的调用,可能使用正确的参数。

如果您在测试期间实际注入该记录器模拟,则该模拟的配置断言充当测试,我的第一点实际上是无效的,因为现在您有测试断言,但它们没有断言返回值(没有在此示例中),但正确调用内部对象。

另一方面,如果您没有将记录器用于重要的事情,那么就没有必要模拟和测试它。在这种情况下,代码示例很糟糕,因为你真的没有什么可以测试的。这应该让您想知道该功能testing()是否真的值得在那里。:)

假设一个真正的函数会做一些除了日志记录之外的其他事情,但是应该有一些可以测试的东西。连同通过配置使记录器静音,您最终应该得到一个非常干净的测试输出。

于 2013-09-13T19:44:36.703 回答