【问题标题】:Ignore exit() and die() with PHPUnit使用 PHPUnit 忽略 exit() 和 die()
【发布时间】:2014-07-17 21:38:41
【问题描述】:

首先,标题表明这是thisthis 的副本,但由于几个原因,这些答案对我不起作用,即使我最初的问题是相同的。我会解释原因。

我的问题是:在我的代码中有几次我想发送标头和正文,然后终止处理。与其他问题不同,我不能使用 return 或抛出异常(这些显然是为不同目的而设计的函数,而不是退出,这不是错误;在某些特定情况下,它只是运行时提前终止)。

仍然,我想编写运行这些方法的单元测试,确保设置了适当的标头(解决方案找到here),输出正文正确(使用测试用例中的$this->expectOutputString()-方法解决) 然后继续测试。在这两者之间,exit 将会发生。

我已经在 PHPUnit 中尝试了 @runInSeparateProcess-annotation,我还检查了 test_helpers 扩展,它有效,但我不想添加另一个扩展(请注意,测试将在生产中运行以及)用于破坏所有内容的一行本机 PHP 代码。在不牺牲最佳实践的情况下,必须有一种更简单的方法。

有没有人能很好的解决这个问题?

【问题讨论】:

  • 你找到解决办法了吗?

标签: php phpunit exit die


【解决方案1】:

我在引导程序中添加了一个变量,在我不需要退出的极少数情况下,我可以在代码中使用 IF 引用该变量。

define ('PHPUNIT_RUNNING', 1); 

普通程序:

if(! @PHPUNIT_RUNNING === 1 )
{
    exit;
}

PHPUnit 没有被定义为规则,所以在 PHP 执行时会产生一个警告(我们用 @ 隐藏它。代码将在不处于测试模式时执行我们想要的操作。这是在主代码之后添加的是在我们将 PHPUnit 测试添加到现有项目时编写的,而不是执行 TDD。

请注意:

我们尽可能少地这样做以解决遗留问题,否则我们会按照其他人的建议进行并抛出异常或将数据返回给父函数。

【讨论】:

  • 感谢您的回复,史蒂文。是的,我的后备解决方案只是使用测试环境变量来解决这个问题,但我不喜欢使用特殊代码来使测试工作(if(!Environment::isTesting()) { exit; })。目前,我正在使用test_helpers,它允许我运行特定方法set_exit_overload(),以基本上使用任何函数(即空)重载退出。
  • 我也讨厌它,但不幸的是,我想不出更简单的方法来解决这个问题。我们拥有的旧代码库导致人们在代码中采取简单的方法并使用 Exit 而不是尝试返回或抛出异常的问题。比真正的 OO 更多的程序代码。
【解决方案2】:

我刚刚测试了以下想法:

ExitException.php:

<?php
class DieException extends Exception {} // for those people who like die as well as exit
class ExitException extends Exception {}

入口点.php:

<?php
require_once 'ExitException.php';

try {
  require 'main_code.php';
  run_main_code();
}
catch (DieException $e) {
  return $e->getMessage();
}
catch (ExitException $e) {
  return $e->getMessage();
}

几个includes 之后:

deepcode.php

<?php
throw new ExitException('Exiting normally');

这模拟了在最顶层捕获的exitdie。您的程序将像以前一样退出,现在可以在不杀死整个测试套件的情况下进行测试。唯一的问题是,如果您在现有代码中也捕获了其他普通的 Exceptions,在这种情况下,您将不得不修改代码以重新抛出 DieException/ExitException 直到它们达到顶层。

另一种选择是干净地返回,这可能涉及重写大量代码。即,如果您当时没有退出,为什么您的程序会产生更多输出?它应该尽早检查是否需要“提前退出”,然后只需调用该代码并流到程序的自然结束。

如果您必须处理第三方库或其他您不应该或不能更改的代码,这个问题就会变得更加困难,但是除非它们带有自己的单元测试,否则为它们是因为理想情况下,您不应该更改第三方代码以避免将来出现兼容性问题。编写良好的第三方库不应该die。它应该始终将控制权返回给调用程序,或者抛出一个可以被捕获的Exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 2011-06-01
    • 2016-05-22
    • 2013-08-24
    • 2011-04-19
    • 2010-12-20
    • 2023-03-12
    相关资源
    最近更新 更多