LoginSignup
2
5

More than 5 years have passed since last update.

PHPUnit で __construct を test する(laravel で試しただけ)

Posted at

__construct の振る舞いを確認したいので、 Mock を使って test してみた。

純粋に PHPUnit だけで試したわけではなく、 Laravel を使った test で試しただけなので、間違いがあるかもしれません。

※タグに laravel 入れてしまってるけど、実際は余り laravel 関係ないはずです。

結論

getMockBuilder()->disableOriginalConstructor()->getMock(); してから、 ReflectionClass 使って getConstructor() する。

前提

なんでも良いのですが、取り敢えずサンプルとして php artisan make:auth したら生成される Auth/LoginController.php を例に。

app/Http/Controllers/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() する。

tests/Unit/app/Http/Controllers/Auth/LoginControllerTest.php
    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 の振る舞いを確認できた。

2
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5