__construct の振る舞いを確認したいので、 Mock を使って test してみた。
純粋に PHPUnit だけで試したわけではなく、 Laravel を使った test で試しただけなので、間違いがあるかもしれません。
※タグに laravel 入れてしまってるけど、実際は余り laravel 関係ないはずです。
結論
getMockBuilder()->disableOriginalConstructor()->getMock();
してから、 ReflectionClass
使って getConstructor()
する。
前提
なんでも良いのですが、取り敢えずサンプルとして php artisan make:auth
したら生成される Auth/LoginController.php
を例に。
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
}
これをテストする。
テストしたいこと
__construct
を呼ぶと、 middleware()
が引数 ('guest', ['except' => 'logout'])
として呼ばれる事を確認したい。
でも、 Mockery::mock($class);
とかすると、既に __construct 通った状態になる。
テストする方法
getMockBuilder()->disableOriginalConstructor()->getMock();
してから、 ReflectionClass
使って getConstructor()
する。
public function testConstruct()
{
$mock = $this->getMockBuilder(LoginController::class)
->disableOriginalConstructor()->getMock();
$mock->expects($this->once())->method('middleware')
->with('guest', ['except' => 'logout']);
$classRef = new ReflectionClass(LoginController::class);
$constructor = $classRef->getConstructor();
$constructor->invoke($mock);
}
これで __construct の振る舞いを確認できた。