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!神様!

この部分使えるなら男前です。

ま、実際の部分は次回以降ですね。

ほなっ! 今回も見直し無しのラフ書きです