首页 > 解决方案 > 如果 Laravel phpunit 测试失败,则打印自定义消息

问题描述

我正在使用 Laravel,我的代码就是这样

$this->actingAs($user)
    ->json('post', '/graphql/admin', ['query' => $query])
    ->assertStatus(200)
    ->assertJsonStructure($expected);

$query如果此测试失败,我想打印变量。

我的理想是在代码末尾添加如下内容:

if ($this->isFail()) {
   echo $query;
}

标签: laravel-5phpunit

解决方案


在文件中TestCase.php添加这个函数

// tests/TestCase.php

public function assertJsonStructure(
    string $url,
    array $params,
    array $expected
) {
    $response = $this->json('post', $url, $params);
    try {
        $response->assertStatus(200)->assertJsonStructure($expected);
    } catch (\Exception $ex) {
        $this->printDie($params, $expected, $ex, $response);
    }
}

而这个功能:

// tests/TestCase.php

private function printDie($params, $expected, \Exception $ex, $response, $user_id = null)
{
    $content = substr($response->getContent(), 0, 1500);
    $trace = debug_backtrace();
    $error = [
        'class' => static::class.'::'.$trace[2]['function'],
        'params' => $params,
        'expected' => $expected,
        'user' => $user_id,
        'error' => $ex->toString(),
        'content' => $content,
    ];
    dd($error);
}

现在,您可以测试您的查询:

$this->assertJsonStructure(
   '/graphql',
   [
      'query' => $query,
   ],
   $expected
);

而且,如果失败,它会打印错误信息,并且更容易调试。你可以在这里看到预览


推荐阅读