php - 如何从 phpunit 中调度的 Action 中获取响应

标签 php unit-testing phpunit

我正在将一些 POST 数据分派(dispatch)给 Controller 的操作。该操作回显了一些 json 编码的字符串。我想验证该操作的 json 编码字符串是否符合我的要求。我想知道如何获取该字符串?

我的测试是这样的:

$this->request->setMethod('POST')
     ->setPost(['test' => 'databaseschema_Database']);

$params = ['action' => 'analysis', 'controller' => 'Index', 'module' => 'default'];
$urlParams = $this->urlizeOptions($params);
$url       = $this->url($urlParams);
$result    = $this->dispatch($url);

$this->assertJsonStringEqualsJsonString(
    $result, json_encode(["status" => "Success"])
);

我的测试失败了,我收到以下消息:

1) IndexControllerTest::testAnalysisAction
Expected value JSON decode error - Unknown error
stdClass Object (...) does not match expected type "NULL".

谁能指导我如何做到这一点?

最佳答案

如果你想做单元测试,你真正想做的是将 json 编码提取到它自己的类中(或 utils 类中的方法或其他东西),然后测试这些方法而不是你的整个 Controller 。

您的方法的问题在于,在运行 phpunit 时,没有 $_POST 数组。上面的代码没有显示正在发生的事情,但我猜想在通过 apache 和 cli 运行时会出现不同的行为,这会导致您的测试失败。

我会创建一个 TransformerClass 并单独测试它:

class JsonTransformer
{
    public function transformPostData(array $postArray)
    {
        // transformation happening
    }
}

class JsonTransformerTest extends \PHPUnit_Framework_TestCase
{
    public function testTransformPostData()
    {
        $transformer = new JsonTransformer();
        $data = array('action' => 'analysis', 'controller' => 'Index', 'module' => 'default');
        $result = $transformer->transformPostData(data);

        $this->assertJsonStringEqualsJsonString($result, json_encode(array("status" => "Success")));
    }
}

如果您需要测试整个请求/响应,您可以使用某种 HTTPClient,请求 url,发送 post 数据并查看响应是否符合您的预期。

介于两者之间的所有事情(比如伪造发布数据)都会给您带来更多的问题和需要维护的代码,而不是它们给您带来的好处。

关于php - 如何从 phpunit 中调度的 Action 中获取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091475/

相关文章:

带有 Zend Framework 2 模块的 PHPUnit

php - PHP的异步电子邮件?

php - 如何在yii2中设置默认 Controller

c# - 断言被测系统应该抛出断言异常

PHPUnit - Bash 脚本输出到变量

phpunit - phpunit测试结果的图形表示

javascript - 简单的 onclick 无法重定向 url

javascript - 使用 ajax 响应显示多个图像

c# - 使方法虚拟化有什么危险?

unit-testing - 测试最佳实践 : For CRUD api