【问题标题】:testing PHP_SAPI!='cli' code with phpunit使用 phpunit 测试 PHP_SAPI!='cli' 代码
【发布时间】:2013-10-01 13:47:01
【问题描述】:

我是 TDD 和 phpunit 的新手。

我正在测试基于其执行方法分叉的代码:

if (PHP_SAPI!='cli') {
    header('HTTP/1.1 '.$statusCode);
}

我想获得尽可能多的代码覆盖率,但我似乎无法测试这部分(因为 phpunit 正在通过命令行界面进行测试)。

有没有办法解决这个问题?或者其他方式来测试这部分?

我想过尝试 curl 什么的,但是测试运行的位置将与测试它的用户的系统相关。

【问题讨论】:

  • 您实际上发现了一种代码气味。相反,您应该将其作为该代码的注入参数两个实现,一个用于 CLI,一个用于 HTTP,以便您可以测试这两个单元。如果这不是您的代码,则无需对其进行单元测试。
  • 顺便说一句,如果您要进行 TDD(在编写代码之前编写测试),您一开始就不会遇到这个问题。作为补充说明,并且为了使 TDD 术语更加清晰,我不是在评判,我也花了相当长的时间才意识到首先编写测试的好处。

标签: php unit-testing tdd phpunit


【解决方案1】:

将该比较抽象为它自己的方法。在您的测试中模拟该方法以控制它是否进入该块。

if ($this->_isCli()) {
    header('HTTP/1.1 '.$statusCode);
}

protected function _isCli() {
  return PHP_SAPI!='cli';
}

【讨论】:

    【解决方案2】:

    如果您使用的是 Mockery 包,则无法模拟受保护的方法。这是其中一位开发人员的评论 -> Calling a mocked protected method

    但是如果你使用php_sapi_name原生函数,你仍然可以创建一个有效的测试

    然后,您可以在测试中(在同一命名空间内)创建一个具有相同名称的虚拟函数来返回任何值。

    在 PHPUnit 中使用扩展来模拟静态和原生函数 -> phpunit-mockfunction

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 2023-04-01
      • 2021-02-08
      • 1970-01-01
      • 2013-06-11
      • 2012-12-18
      • 2011-04-16
      • 2017-11-19
      相关资源
      最近更新 更多