環境・前提
Laravel Framework 5.8.35
要件
api/contactsにキーがnameで、値がTest NameのデータをPOSTしてデータベースに格納されるかテストする
準備
phpunitの設定ファイルに以下を追記する
phpunit.xml
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
作成及び編集するファイル一覧
- tests/Feature/ContactsTest.php
- app/Contact.php
- routes/api.php
- app/Http/Controller/ContactsController.php
- database/migrations/2019_11_04_041040_create_contacts_table.php
1. artisanコマンドでテストをつくる
$ php artisan make:test ContactsTest
Test created successfully.
以下のように編集する
tests/Feature/ContactsTest.php
<?php
namespace Tests\Feature;
use App\Contact;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ContactsTest extends TestCase
{
use RefreshDatabase;//マイグレーションが実行されテーブルが作成される
public function test_a_contact_can_be_added(){
$this->withoutExceptionHandling();//エラーが起きても例外処理をしない
$this->post('/api/contacts', ['name'=>'Test Name']);
$this->assertCount(1, Contact::all());
}
}
2. ルートを定義する
以下のように編集する
routes/api.php
<?php
Route::post('/contacts', 'ContactsController@store');
3. artisanコマンドでモデルをつくる
$ php artisan make:model Contact
Model created successfully.
app/Contact.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
protected $guarded = [];//複数代入時に代入を許可しない属性を配列で設定
}
4. artisanコマンドでコントローラーをつくる
$ php artisan make:controller ContactsController
Controller created successfully.
以下のように編集する
app/Http/Controller/ContactsController.php
<?php
namespace App\Http\Controllers;
use App\Contact;
class ContactsController extends Controller
{
public function store()
{
Contact::create([
'name'=> request('name')
]);
}
}
5. artisanコマンドでマイグレーションをつくる
$ php artisan make:migration CreateContactsTable
Created Migration: 2019_11_04_041040_create_contacts_table
database/migrations/2019_11_04_041040_create_contacts_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateContactsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');//nameコラムを追加する
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('contacts');
}
}
テストを実行する
$ clear && vendor/bin/phpunit --filter test_a_contact_can_be_added
OK (1 test, 1 assertion)
参考
http://recipes.laravel.jp/recipe/1
https://qiita.com/kk_take/items/3e0639ed605f74c34619
https://udemy.benesse.co.jp/development/web/laravel-model.html