在 Codeception 中,是否可以在解析之前拦截和修改 HTTP 响应?如果是这样,如何?

In Codeception, is it possible to intercept and modify HTTP responses before they are parsed? If so, how?

我是 Codeception 的新手,我正在研究如何将它用于 运行 我们的集成/验收测试套件(目前有一些 phpunit 脚本...)。这似乎是一个非常有趣的工具,但我 运行 遇到了一个可能会阻止我们使用它的问题。

我正在尝试找到一种方法来注入中间件或创建一个模块,使我能够在 REST 模块解码之前从服务器的响应中删除 JSON protection string

JSON 以 ")]}',\n" 为前缀使对象无效,这在某些浏览器中防止了一种 CSRF 漏洞,但它破坏了 json_decode()(有意)和Codeception REST 验证方法。

我正在寻找一种方法来修改响应,在测试套件开始使用数据之前去除前缀。有谁知道这是否可能?或者是否有任何内置方法可以使用或重写响应主体?

不幸的是,无法从服务器输出中删除前缀。感谢您的任何建议!

您可以在 REST 模块解析之前修改 HTTP 响应内容。

REST 模块使用 PhpBrowser 或一些 Framefork 模块作为 HTTP 客户端。 因此,要删除 JSON 保护字符串,您需要创建自己的模块来扩展 PhpBrowser 并覆盖 _getResponseContent() 方法,然后在 REST 模块配置中将此模块用作依赖项。

假设我有 REST 方法 http://example.dev/api/v1/test returns 跟随 JSON 带有保护前缀的字符串

)]}'
{"test":"smest"}

/tests/api.suite.yml

class_name: ApiTester
modules:
    enabled:
        - REST:
            depends: \Helper\MyPhpBrowser
            url: 'http://example.dev/api/v1/'      
        - \Helper\Api

/tests/_support/Helper/MyPhpBrowser.php

<?php
namespace Helper;

class MyPhpBrowser extends \Codeception\Module\PhpBrowser
{
    public function _getResponseContent()
    {
        $rawContent = (string)$this->client->getInternalResponse()->getContent();

        // Here we're going to delete protection prefix from response content 
        $rawContent = preg_replace("/^\)\]\}'\n/", "", $rawContent);

        return $rawContent;
    }
}

/api/smestCept.php

<?php 
$I = new ApiTester($scenario);

$I->sendGET('test');

$I->seeResponseContainsJson(['test' => 'smest']);

结果

$ codecept run api smestCept.php
Codeception PHP Testing Framework v2.2.4
Powered by PHPUnit 4.8.27 by Sebastian Bergmann and contributors.

Api Tests (1) -------------------------------------
✔ smestCept:  (0.29s)
---------------------------------------------------


Time: 579 ms, Memory: 12.50MB

OK (1 test, 1 assertion)