测试是否从AJAX请求或从PhpUnit调用方法

时间:2015-10-23 07:44:33

标签: php json zend-framework2 phpunit ajax-request

我已开始对我当前的项目进行单元测试。

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

现在由于

,单元测试失败了
  

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

深入挖掘,我发现可以通过在docBlocks中添加@runInSeparateProcess来解决此问题。

但这只会导致:

  

PHP致命错误:类' PHPUnit_Util_Configuration'没有找到 - 在线365
    PHP堆栈跟踪:
    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标头的发送?

2 个答案:

答案 0 :(得分:0)

从我的观点来看,你有两种可能的解决方案:

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

    我希望这有助于

答案 1 :(得分: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;
}

使用Request类的ZendFramework可以检测调用是否来自AJAX请求。这样,如果有AJAX请求,我只发送标题。