PHPUnit + Laravel = ? ちょっとややこい試験の話
ぐわはははは
さて、時系列で見ると連発です
今回はちょっとだけややこしい試験を行いたいと思います。
JavaならシンプルにClass定義できますが…もしかすっと方法はあるかもしれませんが…
そんな感じで試験です!
<?php
namespace Tests\Unit;
use App\Bonjour;
use App\Hello;
use Tests\TestCase;
class BonjourTest extends TestCase
{
public function test_dire(){
$bonjour = new Bonjour(new Hello());
$this->assertEquals('Bonjour',$bonjour->dire());
}
public function test_echo(){
$bonjour = new Bonjour(new Hello());
$this->assertEquals('hello',$bonjour->echo('hello'));
}
public function test_echo_mock(){
$bonjour = new Bonjour(new GoodNight());
$this->assertEquals('bonne nuit beck',$bonjour->echo('beck'));
}
}
class GoodNight extends Hello{
public function echo($word){
return 'bonne nuit ' . $word;
}
}
うむっ、一番のポイントはクラスです…
次に実装クラスです!
<?php
namespace App;
class Bonjour
{
private $hello;
public function __construct(Hello $hello)
{
$this->hello = $hello;
}
public function dire(){
return 'Bonjour';
}
public function echo($word){
return $this->hello->echo($word);
}
}
激烈シンプルかよ!
さて、解説!
今回のポイントは、BonjourクラスがHelloをラップしているところです。
Laravelを利用している人は分かるかもしれませんが、サービス周りをこのように定義しますね。それを想定しています。
知らない人は… いずれ分かります。
direをコールすると、シンプルに’Bonjour’を返してくれますが、echoの場合は内包したHelloのecho (入力したワードを返すだけ)をコールしています。
さて、試験の方を言うと、test_direは… 略です。
test_echoは新しいHelloを作って、echo、そのまま返ることを確認しています。
今回の重要ポイント!はここだ!test_echo_mockです。
試験内で定義しているクラス GoodNightを使っています。
するってーと動作が変わりますね。
コレが重要なんです!
さっぱりポンな人、こう考えてください
この部分がもしDBにアクセスしていたなら?
DBにアクセスせずに結果だけ取れます。
それを試験に使えるなら?
となります。
Viva!神様!
この部分使えるなら男前です。
ま、実際の部分は次回以降ですね。
ほなっ! 今回も見直し無しのラフ書きです