【问题标题】:How to handle a failed PHP assertion with PHPUnit?如何使用 PHPUnit 处理失败的 PHP 断言?
【发布时间】:2011-11-21 05:27:08
【问题描述】:

我的代码中有一个断言。比如:

assert('is_string($var)');

如果我为 PHPUnit 编写一个测试导致此断言失败并显示消息,Warning: assert(): Assertion "is_string($var)" failed in /path/to/file.php on line ###

而且,我的测试也失败了。我尝试将@expectedException PHPUnit_Framework_Error_Warning 添加到文档块according to the documentation,但这无济于事。我需要做什么才能让我的测试预期这个断言会失败?

【问题讨论】:

  • 不要。采用 。断言。在 。生产
  • 为什么不在您的代码和生产中包含断言,只需设置assert_options(ASSERT_ACTIVE, 0);

标签: php unit-testing phpunit assert assertions


【解决方案1】:

来自php.net/assert

断言应该用作仅调试功能。您可以使用它们进行完整性检查,以测试应始终为 TRUE 的条件,如果不是则指示某些编程错误,或检查某些功能(如扩展功能或某些系统限制和功能)的存在。

断言不应用于正常的运行时操作,例如输入参数检查。根据经验,如果未激活断言检查,您的代码应该始终能够正常工作。

因此,对于正常的代码逻辑,请使用布尔值或一些预定义的常量。对于异常逻辑,请使用普通的 if 语句并针对无效输入抛出 Exception

如果你真的热衷于保留断言,你可以定义一个断言回调,它会抛出一个Exception,你可以在 PHPUnit 中捕获。

// PHP 5.3 Anonymous function as callback
// code is untested
assert_options(ASSERT_CALLBACK, function($file, $line, $code) {
    throw new Exception('Assert failed in $file on line $line');
});

【讨论】:

  • 我没有看到参数,为什么不在正常运行时使用断言。当然,断言不应该用于检查输入参数,例如,但要确保正常的应用程序状态仍然有效。因此,它们可用于检查逻辑一致性。
  • 为什么不在函数失败时手动抛出异常? PHP 手册明确指出断言仅用于调试目的。它是一个帮助您在开发中测试代码的工具,但绝不应该在生产中使用。
【解决方案2】:

断言只有在测试失败时才会失败。

【讨论】:

  • 如果断言失败需要测试怎么办?
  • @Joe:什么意思?断言是您实现测试的方式。所以你想测试测试? :) 在某些时候,您必须依靠您的同事和代码审查。单元测试应该足够小,并且足够接近您指定的要求,这样单元测试中的错误很难产生。
  • 我说的是在我想用单元测试测试的函数中使用assert()。我想这可能有点多余。
  • @Joe:这似乎是一件非常愚蠢的事情。对不起。你的断言应该在你的单元测试中,你永远不应该在其他任何地方使用它们。你为什么这么执着于使用assert()
  • 断言应该在你认为有用的任何地方。此外,您可能正在测试其他人的可能有或没有断言的代码,并且您想测试断言是否按预期工作。不应该在单元测试之外使用断言的想法是荒谬的。 OP 的问题是有效的,据我所知没有答案。
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2011-10-13
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多