首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel中HTTP测试时查看JSON的差异

在Laravel中HTTP测试时查看JSON的差异
EN

Stack Overflow用户
提问于 2017-02-16 21:52:13
回答 1查看 345关注 0票数 1

我正在Laravel5.4中运行一些HTTP测试,主要使用assertJson辅助法和phpunit。当我使用assertEquals对我的模型进行其他测试时,我通常会得到非常好的反馈,具体地,哪些属性、字段等与预期不同。然而,assertJson方法只告诉我存在差异,但没有告诉我这些差异是什么。例如,假设我有一个返回此JSON的路由my/route

代码语言:javascript
复制
{
  "name": "test",
  "foo": "bar"
}

我可能会做这个Laravel测试:

代码语言:javascript
复制
$response = $this->get("my/route");

$response->assertJson([
    'name' => 'test',
    'foo' => 'baz',
]);

我的考试如预期的那样失败了。但是,产生的消息非常没有帮助:

代码语言:javascript
复制
Failed asserting that an array has the subset Array &0 (
    'name' => 'test'
    'foo' => 'baz'
).

对于一个具有更大响应的非平凡示例来说,试图找出JSON响应之间的不同之处可能会变得非常烦人。有没有办法看待预期产出和实际产出之间的具体差异,而不是仅仅知道两者之间有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2017-02-17 08:12:49

您可以将断言包装在try-catch中,然后如果断言失败,您将能够创建新消息并抛出新异常。

代码语言:javascript
复制
/**
 * @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方法还没有得到充分的测试,但是,对于如何比较多维数组,有很多不同的示例。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42285374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档