Тестовые случаи Laravel, влияющие на базу данных - Использование лучших практик - PullRequest
0 голосов
/ 14 октября 2018

В моем приложении Laravel есть следующий контроллер:

class ProjectController extends Controller {
    ...
    public function index() {
        $projects = Project::where('is_completed', false)
            ->orderBy('created_at', 'desc')
            ->withCount(['tasks' => function ($query) {
                $query->where('is_completed', false);
            }])->get();
        return response()->json($projects);
    }
    public function store(Request $request) {
        $validatedData = $request->validate([
            'name' => 'required',
            'description' => 'required',
        ]);
        $project = Project::create([
            'name' => $validatedData['name'],
            'description' => $validatedData['description'],
        ]);
        return response()->json('Project created!');
    }
    ...
}

, на который ссылается следующий маршрут:

Route::get('projects', 'ProjectController@index');
Route::post('projects', 'ProjectController@store');

Кроме того, у меня есть следующий тестовый файл:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProjectTest extends TestCase
{
    public function testCreateProjects()
    {
        $response = $this->post(
            '/api/projects',
            [
                'name' => 'Project 01 Title',
                'description' => 'Project 01 Description',
            ]
        );
        $response = $this->post(
            '/api/projects',
            [
                'name' => 'Project 02 Title',
                'description' => 'Project 02 Description',
            ]
        );

        $response = $this->get('/api/projects');
        $data = $response->json();

        $this->assertSame(2, count($data));
    }
}

В качестве живой базы данных я использую: MySQL.Это необходимо.

В файле: /.env.testing Я указал тестовую базу данных MySQL, поэтому я не вносил изменений в действующую базу данных.

Есть несколько файлов, таких какследующие:

/database/migrations/<TIMESTAMP>_create_projects_table.php

, которые создают необходимые таблицы при выполнении некоторых из следующих команд:

$ php artisan:migrate
$ php artisan:migrate --env=testing

Я запускаю тестовые примеры с помощью команды:

$ phpunit

Приведенный выше тестовый пример работает хорошо только в том случае, если тестовая база данных пуста.

Тогда я хочу узнать, каковы лучшие практики для запуска тестовых случаев? Например, возможно:

  • очищать каждую таблицу перед запуском контрольных примеров?
  • использовать базу данных другого типа, например, базу данных on-the-fly, SQLite и т. Д. (Но с учетом того, что действующая база данных должнабыть MySQL).

Есть идеи по этому поводу?Я ищу лучшие практики.

Спасибо!

1 Ответ

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

Вы можете использовать SQLite в памяти.Другим хорошим вариантом является использование транзакций базы данных, где вы можете откатывать запросы после каждого теста.Laravel предоставляет удобную черту DatabaseTransactions для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...