如何查看数据库特殊字符\ r和\ n

时间:2016-10-08 13:59:59

标签: php unit-testing laravel-5.3

我有一个遗留系统,我正在实施一个新的集成功能。此功能是在Laravel Framework下开发的,我的一项测试依赖于在数据库中查看已解析的电子邮件正文。

    // Assert
    $this->seeInDatabase('ticket', ['title' => 'TDD', 'user_id' => $user->id])
        ->seeInDatabase('interaction', [
            'response' => 'message.\r\n',
            'user_id' => $user->id
        ]);

问题是:

1) tests\Artisan\InboxTest::it_should_parse_valid_email_and_make_ticket
Unable to find row in database table [interaction] that matched 
attributes 
---> [{"response":"message.\\r\\n","user_id":12}].
Failed asserting that 0 is greater than 0.

显然,seeInDatabase会转义反斜杠并查找message.\\r\\n,它永远不会找到,因为信息实际上是message.\r\n

我尝试自己逃避,但得到了相同的结果。

TL; DR :如何让Laravel查看数据库中的字符?

1 个答案:

答案 0 :(得分:1)

特质:

InteractsWithDatabase

描述了seeInDatabase方法:

protected function seeInDatabase($table, array $data, $connection = null)
{
    $database = $this->app->make('db');

    $connection = $connection ?: $database->getDefaultConnection();

    $count = $database->connection($connection)->table($table)->where($data)->count();

    $this->assertGreaterThan(0, $count, sprintf(
        'Unable to find row in database table [%s] that matched attributes [%s].', $table, json_encode($data)
    ));

    return $this;
}

正如您所看到的,where函数的工作方式与通常没有任何数据转义一样。我建议在特征中添加一个自定义方法来处理像你这样的边缘情况。例如:

protected function seeResponseInDatabase($table, $response, $connection = null)
{
    $database = $this->app->make('db');

    $connection = $connection ?: $database->getDefaultConnection();

    $count = $database->connection($connection)->table($table)->where('response','like', '%' . $response . '%')->count();

    $this->assertGreaterThan(0, $count, sprintf(
        'Unable to find row in database table [%s] that matched attributes [%s].', $table, $response
    ));

    return $this;
}

因此,不要传递数组,只需传递预期的响应即可。 我不会首先使用此路由,而是实际使用 seeInDatabase 方法的$ data数组,以确保数据按预期传递给where子句。

希望这可以帮助您解决问题。