Тест не пройден из-за форматирования даты и времени при поиске модели в базе данных - PullRequest
0 голосов
/ 17 октября 2018

Начиная с Laravel 5.6, Eloquent Date Casting доступен.
Итак, у меня есть модель MyModel с:

class MyModel extends Model {
    protected $casts = ['from' => 'date:Y-m-d', 'to' => 'date:Y-m-d'];
    protected $dates = ['from', 'to'];
}

И фабрикой:

$factory->define(MyModel::class, function(Faker $faker) {
    return [
        'from' => Carbon::instance($faker->dateTime),
        'to' => Carbon::instance($faker->dateTime),
        // some more attributes
    ];
}

В моем модульном тесте я ищу экземпляр MyModel :

/** @test */
public function example() {
    $myModel = factory(MyModel::class)->create();

    $this->assertDatabaseHas('my_models', $myModel->attributesToArray());
}

И вот что я получаю (отрывок):

Не удалось утверждать, что строка в таблице [my_models] соответствует атрибутам {
"from": "2019-01-12",
"to": "2019-02-13",
}.
Найдено: [{
" от ":" 2019-01-12 00:00:00 ",
" до ":" 2019-02-13 00:00: 00 ",
}].

Очевидно, что тест не пройден, потому что время добавляется в поля записи базы данных.Они имеют тип date.

Я мог бы обновить утверждение до чего-то вроде этого ...

$this->assertDatabaseHas('my_models', [
    'from' => $myModel->from->toDateTimeString(),
    'to' => $myModel->to->toDateTimeString(),
] + $myModel->attributesToArray());

... но это далеко от элегантности.

Что мне сделать, чтобы сделать это утверждение успешным?

1 Ответ

0 голосов
/ 29 октября 2018

В итоге я написал новый метод подтверждения, который форматирует свойства даты модели в Y-m-d H:i:s для правильного сравнения:

protected function assertDatabaseHasModel(string $table, Model $model, ?string $connection = null) {
    $attributes = $model->attributesToArray();
    $reflection = new ReflectionClass($model);
    $property = $reflection->getProperty('casts');
    $property->setAccessible(true);

    collect($property->getValue($model))
        ->filter(function(string $cast) {
            return starts_with($cast, 'date:');
        })
        ->each(function(string $cast, string $field) use($model, &$attributes) {
            $attributes[$field] = $model->$field->toDateTimeString();
        });

    $this->assertDatabaseHas($table, $attributes, $connection);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...