1

我已经开始对我当前的项目实施单元测试。

虽然目前所有单元测试都通过了,但为了方便,我对方法进行了更改以jsonResponse发送 json 标头。这有助于我将 json 响应视为 Chrome 控制台中的树。

现在单元测试失败是由于

无法修改标头信息 - 标头已发送
(输出开始于 [fullPath]/phpunit/src/Util/Printer.php:134)

深入挖掘,我发现这可以通过添加@runInSeparateProcessdocBlocks 来解决。

但这只会导致:


PHP 致命错误:在第 365 行PHP 堆栈跟踪中找不到类“PHPUnit_Util_Configuration” :
PHP 1. {main}() -:0

这是我的 json 方法之一(在通过 AJAX 请求调用的几种方法的末尾调用):

/**
 * Helper function to print a json encoded success message back to the frontend.
 *
 * @param array $returnData
 *
 * @return bool
 *
 * @runInSeparateProcess
 */
public function returnJsonSuccess($returnData = [])
{
    header('Content-Type: application/json');
    echo json_encode(
        [
            "success" => true,
            "data"    => $returnData,
        ]
    );
    return true;
}

那么,切入正题,我怎样才能使它正常工作?

我的选择之一是检测是否从单元测试中调用该方法,并仅在正常调用时有条件地发送标头。我在想最简单的方法是在引导文件中定义一个环境变量或一个常量,然后在我的BaseController.

有没有一种更简洁的方法可以让我的单元测试再次工作,同时保持 json 标头的发送?

4

2 回答 2

0

从我的角度来看,您有两种可能的解决方案:

  1. 在您的 phpunit 引导文件中设置环境密钥并检查该服务器密钥是否存在
  2. 在您的类中使用将在您的setUp方法中禁用的变量

我希望这个对你有用

于 2015-10-23T07:50:20.643 回答
0

自己解决了:

/**
 * Helper function to print a json encoded success message back to extJs.
 *
 * @param array $returnData
 *
 * @return bool
 */
public function returnJsonSuccess($returnData = [])
{
    $request = $this->getRequest();
    if ($request && $request->isXmlHttpRequest()) {
        header('Content-Type: application/json');
    }
    echo json_encode(
        [
            "success" => true,
            "data"    => $returnData,
        ]
    );
    return true;
}

ZendFramework 使用Request该类可以检测调用是否来自 AJAX 请求。这样,我只在有 AJAX 请求时才发送标头。

于 2015-10-23T08:08:14.187 回答