--> -->

skimemo


Laravel-20181223 の変更点


#title(外部クラスの呼び出しをMockする)
* 外部クラスの呼び出しをMockする [#v5700434]
これは[[12/21分:Laravel-20181221]]の続きです。~
これは[[12/21分:https://www.webdb.co.jp/~atsumi/skimemo/index.php?Laravel-20181220]]の続きです。~
~
12/20時点ではoverloadがうまくいかず、外部クラス参照のMockを上手く作れなかったのですが、原因が判明しましたのでその経緯を記述します。~
~
** 問題1: overloadに失敗する [#q81d471e]
テストコードに以下のように書きます。
#code(php){{
$mock = \Mockery::mock('overload:SomeNamespace\SubClass');
}}
以下のエラーとなります。
 Mockery\Exception\RuntimeException: Could not load mock SomeNamespace\SubClass, class already exists
当該テストコードではuseもnewもしていないのですが、これが出ます。~
そこで、参考ページ((MockeryでoverloadをつかってテストしたらCould not load mockとか言われる件&br;https://qiita.com/kadoyau/items/13d515f42a943a6c6c1a))の通り、アノテーションを入れます。
#code(php){{
/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */
public function testMyClass() {
    :
}}
[[runInSeparateProcess:https://phpunit.readthedocs.io/ja/latest/annotations.html#runinseparateprocess]] : 別プロセスで動かします~
[[preserveGlobalState:https://phpunit.readthedocs.io/ja/latest/annotations.html#preserveglobalstate]]  : 前項に関連して親プロセスの状態維持を無効にします~
** 問題2: $nameが無いと言われる [#b1366fec]
すると今度は以下のようなエラーが出ました。
 PHPUnit_Framework_Exception: PHPUnit_Framework_TestCase::$name must not be null.
実はこのテストコードは、PHPUnit_Framework_TestCaseを継承しておらず、TestCase(PHPUnit_Framework_TestCase<-Illuminate\Foundation\Testing\TestCase<-Tests\TestCase)を継承しています。(Laravelの標準的な書き方)~
ところがこのTestCaseに以下のようなconstructorを書いていました。~
#code(php){{
public function __construct() {
	parent::__construct();
	// ごにょごにょ
}
}}
Laravelを始めた頃(言い訳)、特に誰(phpStorm)にも怒られなかったのでこのまま安易に書いていましたが、親クラスのコンストラクタは任意のパラメータとして$name, $data, $dataNameが定義されています。従って、ここは以下のように書くべきでした。((PHPUnit_Framework_Exception: PHPUnit_Framework_TestCase::$name must not be null&br;https://stackoverflow.com/a/41534986/5150050))
#code(php){{
public function __construct($name = null, array $data = [], $dataName = '') {
	parent::__construct($name, $data, $dataName);
	// ごにょごにょ
}
}}
これで無事overloadのテストを通すことができました。