我是Codeception的新手,我正在研究使用它来运行我们的集成/验收测试套件(目前有些phpunit脚本......)。这似乎是一个非常有趣的工具,但我遇到了一个可能阻止我们使用它的问题。
我试图找到一种方法来注入中间件或创建一个模块,允许我从服务器的响应中删除JSON protection string,然后由它解码REST模块。
JSON以")]}',\n"
为前缀使对象无效,这可以防止某些浏览器中出现某种类型的CSRF漏洞,但它会(有意)中断json_decode()
和Codeception REST验证方法。 / p>
我正在寻找一种方法来修改响应,在测试套件开始使用数据之前剥去前缀。有谁知道这是否可能?或者,如果有任何内置的方法来处理或重写响应主体?
不幸的是,从服务器输出中删除前缀不是一种选择。谢谢你的建议!
答案 0 :(得分:0)
您可以在REST模块解析之前修改HTTP响应内容。
REST模块使用PhpBrowser
或一些Framefork模块作为HTTP客户端。
因此,要删除JSON保护字符串,您需要创建自己的扩展PhpBrowser
的模块并覆盖_getResponseContent()
方法,然后在REST模块配置中将此模块用作依赖项。
假设我有REST方法http://example.dev/api/v1/test
,它返回带有保护前缀的以下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)