我将一些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".
任何人都可以指导我如何做到这一点吗?
答案 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,发送帖子数据并查看响应是否符合您的期望。
介于两者之间的所有东西(比如伪造帖子数据)会让你遇到更多的问题和更多的代码来维护,而不是你的好。