一通りまとまった情報が見つからず、時間を食ったのでまとめ。
キャッシュのクリアを忘れてひどい目にあった。
やりたいことは表題の通り。
必要なパッケージの追加
composer.jsonに追加
composer.json
{
"require-dev": {
// ...
"doctrine/dbal": "^2.5"
},
//...
}
インストール
$ composer update
database.phpに設定を追加
config/database.php
'connections' => [
'sqlite' => [
// ...
],
// 以下を追加
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
phpunitで使用するDB設定を指定
testingの時、上記の設定を使うようにDB_CONNECTIONの行を追加
phpunit.xmlを環境ごとに変えたいこともあるかもしれないので
そういう時はphpunit.xml.defaultなどを作成したほうがいいかもしれない。
phpunit.xml
<php>
....
<env name="DB_CONNECTION" value="sqlite_testing"/>
</php>
注意!!!
ここで設定のキャッシュをクリア
気づかないと辛い目に遭う
$ php artisan config:clear
DatabaseMigrations trait
テストごとにdbのmigrateとresetをする。
setUp()でArtisan::call('migrate')を呼ぶ方法もあるみたいだけど
DatabaseMigrationsトレイトを使う方が簡単と思われる。
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends TestCase
{
use DatabaseMigrations; // 追加
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
// your test
}
}
テスト用データ投入
factoryが用意されてるので以下参照
Userクラスのfactoryが初めから書かれている。
/database/factories/ModelFactory.php
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
使い方
public function testSeeUser()
{
$user = factory(App\User::class)->make([
'name' => 'marisa' //各fieldは自由に上書きできる
]);
$user->save();
$this->seeInDatabase('users', ['name' => 'marisa']);
}