Как увидеть специальные символы r и n в базе данных

#php #unit-testing #laravel-5.3

#php #модульное тестирование #laravel-5.3

Вопрос:

У меня есть устаревшая система, в которой я внедряю новую интегрированную функцию. Эта функция разрабатывается в рамках Laravel Framework, и один из моих тестов основан на просмотре проанализированного тела электронной почты внутри базы данных.

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

Проблема в том:

 1) testsArtisanInboxTest::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.rn .

Я попытался избежать этого сам, но получил тот же результат.

TL; DR: как мне заставить Laravel видеть символы в базе данных?

Ответ №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;
}
  

Итак, вместо передачи массива просто передайте ожидаемый ответ.
Вместо того, чтобы сначала идти по этому маршруту, я бы на самом деле dd массив $data метода seeInDatabase просто чтобы убедиться, что данные передаются в предложение where, как и предполагалось.

Надеюсь, это даст вам некоторое представление о решении вашей проблемы.