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するのが簡単です。