我正在将一些 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/