#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, как и предполагалось.
Надеюсь, это даст вам некоторое представление о решении вашей проблемы.