Skip to content

Instantly share code, notes, and snippets.

@dehsilvadeveloper
Last active January 9, 2025 12:21
Show Gist options
  • Save dehsilvadeveloper/a1f993d9df4db0a5f47a5ac0696287f5 to your computer and use it in GitHub Desktop.
Save dehsilvadeveloper/a1f993d9df4db0a5f47a5ac0696287f5 to your computer and use it in GitHub Desktop.
Unit tests for models on Laravel 10 applications with custom TestCase

Unit tests for models on Laravel 10 applications with custom TestCase

Testes unitários para models em aplicações Laravel 10 com TestCase customizado

Introduction

I will show a way to make testing your models a little bit easier using a custom TestCase.

// Path: Tests/ModelTestCase.php
<?php
namespace Tests;
use Tests\TestCase;
use Tests\TestsHelpers\DataTransferObjects\ModelConfigurationAssertionParamsDto;
abstract class ModelTestCase extends TestCase
{
protected function runConfigurationAssertions(ModelConfigurationAssertionParamsDto $dto): void
{
$this->assertEquals($dto->fillable, $dto->model->getFillable());
$this->assertEquals($dto->guarded, $dto->model->getGuarded());
$this->assertEquals($dto->hidden, $dto->model->getHidden());
$this->assertEquals($dto->visible, $dto->model->getVisible());
$this->assertEquals($dto->casts, $dto->model->getCasts());
$this->assertEquals($dto->dates, $dto->model->getDates());
$this->assertEquals($dto->primaryKey, $dto->model->getKeyName());
$collection = $dto->model->newCollection();
$this->assertEquals($dto->collectionClass, get_class($collection));
if ($dto->table !== null) {
$this->assertEquals($dto->table, $dto->model->getTable());
}
}
}
// Path: Tests/TestsHelpers/DataTransferObjects/ModelConfigurationAssertionParamsDto.php
/*
* Obs: This DTO was built using the package "laravel-data".
* You can learn more about the package here: https://spatie.be/docs/laravel-data/v4/introduction
*/
<?php
namespace Tests\TestsHelpers\DataTransferObjects;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Mappers\SnakeCaseMapper;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
#[MapInputName(SnakeCaseMapper::class)]
class ModelConfigurationAssertionParamsDto extends Data
{
public function __construct(
public Model $model,
public array $fillable = [],
public array $hidden = [],
public array $guarded = ['*'],
public array $visible = [],
public array $casts = ['id' => 'int'],
public array $dates = ['created_at', 'updated_at'],
public string $collectionClass = Collection::class,
public ?string $table = null,
public string $primaryKey = 'id'
) {
}
}
// Path: Tests/Unit/App/Domain/User/Models/UserTest.php
// Obs: The model User was used as an example. You can do this with any model.
<?php
namespace Tests\Unit\App\Domain\User\Models;
use Tests\ModelTestCase;
use Tests\TestsHelpers\DataTransferObjects\ModelConfigurationAssertionParamsDto;
use App\Domain\User\Models\User;
class UserTest extends ModelTestCase
{
/**
* @group user
*/
public function test_has_valid_configuration(): void
{
$dto = ModelConfigurationAssertionParamsDto::from([
'model'=> new User(),
'fillable' => ['name', 'email', 'password'],
'hidden' => ['password', 'remember_token'],
'casts' => [
'id' => 'int',
'email_verified_at' => 'datetime',
'password' => 'hashed'
],
'table' => 'users'
]);
$this->runConfigurationAssertions($dto);
}
}
// Path: App/Domain/User/Models/User.php
// Obs: This model is used as an example. You can do this with any model.
<?php
namespace App\Domain\User\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens;
use HasFactory;
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment