Lravelの知識なさすぎなのか、ドキュメントがないのか、探すのが下手なのか…
DBに接続するだけで4時間くらいかかった…

目次

  1. 時間がかかった言い訳
    1. 思い込み
    2. 混乱
    3. migrationって何?
    4. そもそも…
  2. 設定ファイルの場所とサンプル
  3. 所感

DB接続してテストしようとしたらいきなりPDOExceptionですよ。
こんな感じ。

1
PDOException: SQLSTATE[HY000]: 1 no such table: テーブル名 (SQL: 実行したSQL)

要するに「テーブルないですよ」って言われてるんです。
以下、右往左往してた記録なのです。結論は下の方に…

時間がかかった言い訳


思い込み

PHPUnit実行時は.env.local.phpに記述した開発環境のDBに接続されるという思い込みがあった。
(弊社では開発時の設定は.env.local.phpに記述しているので自動でそちらに接続されるものと思っていた)

混乱

テスト時の接続先DBは.env.local.phpを設定するとかphpunit.xmlに記述するとかいう情報も見つかって結局どこで設定すればよいのかさっぱりわからなかった。

前述の通り.env.local.phpには既に記述してあるし、phpunit.xmlに設定を記述してもつながらないし…
結局、弊社環境ではこれらは関係なかった…

※実際に.env.local.phpとかphpunit.xmlに設定している事例があるようなので他の設定の関連ではこれらのファイルへの記述でも設定できるかもしれない。

migrationって何?

似たような質問が英語圏の掲示板で上がっていたが「migrationをやれ」という回答が多くて、migration周りを調べていた。
そもそもmigrationが何かよくわかってない(今でもよくわかっていない)

そもそも…

PHPUnitでDB接続してテストする際の設定に関する 「基本的な」 情報がまったく見つからなかった。
割と応用的なのとかは結構見つかった。

探し方が下手なのか?
調べるまでもなく常識なのか?

設定ファイルの場所とサンプル


app/config/testing/database.phpにPHPUnitでテストする際の接続先を書けばよい。
(前述の通りその他の設定如何によって違うかもしれない)

設定ファイル(database.php)は下記のように記述する。
書き方がわからなければapp/config/database.phpをコピーしてテスト用のDBに書き換えればよい。

なお、ローカルのDBを使う場合にhostlocalhostと書いても繋がらないらしい。
127.0.0.1と書く必要があるとのこと。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

return array(
'fetch' => PDO::FETCH_ASSOC,
'default' => 'mysql',
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => '***.***.***.***', //ローカルでやる場合は127.0.0.1
'port' => '****',
'database' => '****',
'username' => '********',
'password' => '********',
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
),
),
'migrations' => 'migrations',
);

テストするクラスのsetUpメソッドに事前にテストに必要な処理(つまりデータの準備とか)を記述するらしい。

1
2
3
4
5
6
7
8
9
public function setUp()
{
//必須らしい
parent::setUp();

//テスト開始時にmigrationを実行する必要がある?らしい...
//migrationが何かよくわかってないので下記のコードは鵜呑みにしないでください
Artisan::call('migrate',array('--path' => 'app/database/migrations/testing'));
}

所感


migration理解しないとやべ~。