ことの始まり
- 共通化したモジュールをフロント側でつかいたい。
- 単体テストでif(なんちゃら)とテストのときだけ条件分岐みたいなコードは書きたくない。
Laravelの基本機能が単体でも動くようにしなければなりません!
結論
- 弊社に業務委託で参加されているエンジニアの尽力により・・・
use PHPUnit_Framework_TestCase;
use Illuminate\Config\Repository;
use Illuminate\Container\Container;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Facade;
use Illuminate\Log\Writer;
use Monolog\Logger;
class TestCase extends PHPUnit_Framework_TestCase
{
public static function setUpBeforeClass()
{
$app = new Container();
$config = new Repository([
'app.log' => 'daily',
'app.log_level' => 'debug',
]);
$app->instance('config', $config);
$app->alias(Dispatcher::class, 'events');
$app->instance('log', $log = new Writer(new Logger('unittest'), $app['events']));
Facade::setFacadeApplication($app);
}
}
- あとはこのクラスを継承してテストコードを書いていただければ、テスト時にも\Log::debug('hoge'); みたいなコードも動きますのでフレームワークに実際に組み込んだときもそのまま動くというからくりです。
- これを応用すれば、全てのファサードを使えるようになるはずです。
余談
- monolog設定もmonologオブジェクトにsetすれば思いのまま使えます。