Метод assertModelMissing
Метод assertModelMissing применяется в тестах Laravel для проверки того, что указанная модель не существует в базе данных. Он принимает экземпляр модели Eloquent и проверяет, что запись с таким первичным ключом отсутствует в таблице. Если модель присутствует в базе, тест завершится с ошибкой. Данный метод полезен при проверке операций удаления, а также для подтверждения того, что определённые данные не были созданы или сохранены.
Синтаксис
<?php
$this->assertModelMissing($model);
?>
Метод принимает один обязательный параметр - экземпляр модели Eloquent, которую необходимо проверить на отсутствие в базе данных. Если модель найдена по её первичному ключу, тест будет провален.
Пример
Давайте проверим, что статья была успешно удалена из базы данных:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ArticleTest extends TestCase
{
use RefreshDatabase;
public function test_article_can_be_deleted()
{
$article = Article::factory()->create([
'title' => 'article',
'content' => 'text'
]);
$article->delete();
$this->assertModelMissing($article);
}
}
?>
Результат выполнения кода:
"Test passed: model is missing"
Если бы модель всё ещё существовала в базе, тест выдал бы ошибку с сообщением о том, что запись найдена.
Пример
Рассмотрим проверку отсутствия модели после каскадного удаления через внешний ключ:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Category;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
class CategoryTest extends TestCase
{
use RefreshDatabase;
public function test_articles_deleted_with_category()
{
$category = Category::factory()->create([
'name' => 'category'
]);
$article = Article::factory()->create([
'category_id' => $category->id,
'title' => 'article'
]);
$category->delete();
$this->assertModelMissing($article);
}
}
?>
Результат выполнения кода:
"Test passed: article model is missing"
Пример
Проверим, что модель не была создана при неудачной валидации:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_user_not_created_with_invalid_data()
{
$user = new User([
'name' => '',
'email' => 'invalid-email'
]);
$saved = $user->save();
$this->assertFalse($saved);
$this->assertModelMissing($user);
}
}
?>
Результат выполнения кода:
"Test passed: user model is missing"
Пример
Использование метода при проверке ответа API на удаление ресурса:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ApiArticleTest extends TestCase
{
use RefreshDatabase;
public function test_api_deletes_article()
{
$article = Article::factory()->create([
'title' => 'article',
'content' => 'text'
]);
$response = $this->deleteJson('/api/articles/' . $article->id);
$response->assertStatus(200);
$this->assertModelMissing($article);
}
}
?>
Результат выполнения кода:
"Test passed: article is missing after API deletion"
Смотрите также
-
метод
assertModelExists,
который проверяет существование модели в базе данных -
метод
assertDatabaseMissing,
который проверяет отсутствие записей в таблице по условию -
метод
assertSoftDeleted,
который проверяет мягкое удаление модели -
класс
RefreshDatabase,
который используется для сброса базы данных между тестами