如何从phpunit中调度的动作获得响应

时间:2013-02-26 14:23:09

标签: php unit-testing phpunit

我将一些POST数据发送给控制器的操作。那个动作回应了一些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".

任何人都可以指导我如何做到这一点吗?

1 个答案:

答案 0 :(得分:0)

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

你的方法的问题是,当运行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,发送帖子数据并查看响应是否符合您的期望。

介于两者之间的所有东西(比如伪造帖子数据)会让你遇到更多的问题和更多的代码来维护,而不是你的好。