LoginSignup
9
7

More than 5 years have passed since last update.

PhpStorm 2016.2でPHPUnitのアサーションの補完が効かない問題

Last updated at Posted at 2016-08-20

8/26 追記:PhpStorm 2016.2.1がリリースされました。2016.2.1ではPHPUnitのアサーションの補完が効かない問題は修正されています。


PhpSrotm 2016.2では、コード補完の挙動が変わりました。
この結果、$this->assertSame()のような形でPHPUnitのメソッドを呼び出す際、$this->までを入力した段階でCtrl + Spaceを押してもassertSameが補完されなくなりました。

なお、この問題はPhpStorm 2016.2の初期バージョンにのみ存在し、2016.1や2016.2.1には存在しません。

TL;DR

解決策は以下の3パターン

  • PhpStorm 2016.2.1を使う
  • 2016.1以前のバージョンを使う
  • アサーションメソッドを関数または静的メソッドとして呼び出す
    • assertSame() または self::assertSame()

問題が発生した経緯

  • PhpStorm 2016.1で補完の挙動が変更された
    • $thisのコンテキストで、静的メソッドが補完されなくなった
  • PHPUnitでは、アサーションメソッドを静的メソッドとして定義している
  • PHPUnitを使う際は、$thisからアサーションメソッドを呼び出すのが一般的
  • 結果、PHPUnitのメソッド補完が効かなくなる!

※詳細はPhpStorm Blogの記事Completion Changes in PhpStormを参照

なお、完全に補完が効かなくなったわけではなく、Ctrl + Spaceを2度押しすれば補完はされます。が、アサーションメソッドを書く度にそんなことやってられない。

というわけで、PHpStormのイシュートラッカーにバグ報告がされました。JetBrainsはこの問題をバグとみなして修正し、8/10にリリースされたPhpStorm 2016.2.1 EAP 162.1628では修正済みとなっています。

2016.2.1 EAP 162.1628の時点では、$this->で静的メソッドが補完されるようになったのはPHPUnit関連だけですが、静的メソッド補完が効くクラスをユーザが設定できるようにするオプションの追加が提案されています。

余談

PHPUnitには、Functions.phpというファイルが含まれています。
このファイルには、アサーションメソッドを関数として呼ぶことができるようにする、以下のような関数定義が含まれています。

function assertSame($expected, $actual, $message = '')
{
    return call_user_func_array(
        'PHPUnit_Framework_Assert::assertSame',
        func_get_args()
    );
}

したがって、以下の3つの呼び出し方は、いずれも問題ありません。

  • $this->assertSame()
  • self::assertSame()
  • assertSame()

今まで、$thisを書くのが面倒だと思ってたので、関数記法が使えることをもっと早く知りたかった…。
関数記法を使うと、アサーションメソッドを拡張しづらくなりますが、そもそも拡張するようなものではないので、問題ないと思います。

※追記:Functions.phpの中身は関数なので、オートロードされません。関数記法を使いたい場合、テストケースの基底クラスを作って、そのクラスでFunctions.phpをrequireするのが簡単です。

9
7
3

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
9
7