我正在Laravel5.4中运行一些HTTP测试,主要使用assertJson辅助法和phpunit。当我使用assertEquals对我的模型进行其他测试时,我通常会得到非常好的反馈,具体地,哪些属性、字段等与预期不同。然而,assertJson方法只告诉我存在差异,但没有告诉我这些差异是什么。例如,假设我有一个返回此JSON的路由my/route:
{
"name": "test",
"foo": "bar"
}我可能会做这个Laravel测试:
$response = $this->get("my/route");
$response->assertJson([
'name' => 'test',
'foo' => 'baz',
]);我的考试如预期的那样失败了。但是,产生的消息非常没有帮助:
Failed asserting that an array has the subset Array &0 (
'name' => 'test'
'foo' => 'baz'
).对于一个具有更大响应的非平凡示例来说,试图找出JSON响应之间的不同之处可能会变得非常烦人。有没有办法看待预期产出和实际产出之间的具体差异,而不是仅仅知道两者之间有什么不同?
发布于 2017-02-17 08:12:49
您可以将断言包装在try-catch中,然后如果断言失败,您将能够创建新消息并抛出新异常。
/**
* @test
* @group new
*/
public function testExample()
{
$response = $this->get('test');
try {
$expected = [
'name' => 'test',
'foo' => 'barz',
];
$response->assertJson($expected);
} catch (\Exception $e) {
$exporter = new \SebastianBergmann\Exporter\Exporter();
$message = 'The following items we\'re expected to be different ' .
$exporter->export($this->arrayRecursiveDiff($expected, $response->decodeResponseJson()));
throw new \PHPUnit_Framework_ExpectationFailedException($message);
}
}
public function arrayRecursiveDiff($array1, $array2)
{
$return = [];
foreach ($array1 as $key => $value) {
if (is_array($array2) && array_key_exists($key, $array2)) {
if (is_array($value)) {
$recursiveDiff = $this->arrayRecursiveDiff($value, $array2[$key]);
if (count($recursiveDiff)) {
$return[$key] = $recursiveDiff;
}
} else {
if ($value != $array2[$key]) {
$return[$key] = $value;
}
}
} else {
$return[$key] = $value;
}
}
return $return;
}请注意,arrayRecursiveDiff方法还没有得到充分的测试,但是,对于如何比较多维数组,有很多不同的示例。
希望这能有所帮助!
https://stackoverflow.com/questions/42285374
复制相似问题