laravelのテストケースを作成するコマンドを作った

個人的にですが、laravelのmakeコマンドにはなぜユニットテストが無いのか?と思っていました。 (CakePHPであればbakeした時にTestCaseのファイルも一緒に生成してくれるのに…)

パッケージがあるんじゃないかと探してみましたが見つかりませんでした。

ないなら作るしかないかと思って作ってみました。

ootatter/laravel-make-testcase

3つの生成方法があり、

方法1
php artisan make:testcase

app_path()配下のPHPファイルを走査してclass定義されているPHPファイルを選択するような方法になります。

方法2
php artisan make:testcase Http\\Controllers\\PostController

引数にNamespaceとクラス名で指定できるようにしてみました。 なんとなく他のmake:controllerなどに合わせるような形で。

方法3
php artisan make:testcase --all

方法1で検出したファイルを全部生成します。 ただし、既に生成されている場合は確認を求めるようにしてます。

生成される内容

出力先はtests以下に同じ階層で、Testのsuffixがついた形で出力します。 ただし、クラス名が重複しないようにフォルダの階層をprefixとして付与するようにしました。 生成されるTestCase内でnamespaceを使うべきか悩みましたがlaravelのコアのテストケースもフォルダ構成は同等でnamespaceは使っていなかったので合わせました。

生成対象のメソッドは自クラスのpublicメソッドで、且つtraitを使ったメソッドは除外して生成するようにしました。

生成されるコードは下記のような感じで出力されます。

https://github.com/ootatter/laravel-make-testcase/blob/master/tests/fixture/SomeControllerTest.php

use DummyApp\Http\Controllers\SomeController;

/**
*
*/
class HttpControllersSomeControllerTest extends TestCase
{
/**
* Setup the test environment.
*
* @return void
*/
public function setUp()
{
parent::setUp();
}

/**
* Clean up the testing environment before the next test.
*
* @return void
*/
public function tearDown()
{
parent::tearDown();
}

/**
* @test
* @covers DummyApp\Http\Controllers\SomeController::publicSomeMethod
* @todo Implement publicSomeMethod().
*/
public function publicSomeMethod()
{
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet.'
);
}
/**
* @test
* @covers DummyApp\Http\Controllers\SomeController::publicStaticMethod
* @todo Implement publicStaticMethod().
*/
public function publicStaticMethod()
{
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet.'
);
}
}

packagistの登録

今回初めてComposerのpackagistに登録してみました。
最初は、composer require ootatter/laravel-make-testcaseをしても下記のメッセージがでて?_?状態でした。"minimum-stability": "stable"を入れても状況は変わりませんでした。

[InvalidArgumentException]
Could not find package ootatter/laravel-make-testcase at any version for your minimum-stability (stable). Check the package spelling or your minimum-stability

とりあえず、ちゃんとtagをつけたところ上記コマンドでインストールできるようになったんですが。。。

よくcomposer経由でインストールするとtestsが含まれてなかったりするんですけどどうやるんですかね。。。 誰か教えてください。