Edited at

PHPUnitでmockした関数の引数を指定する方法

More than 3 years have passed since last update.

CakePHPとPHPUnitを使ってmockを作成する機会があり、mockする関数の引数を指定する方法を調べたのでまとめました。


環境


  • PHP 5.6.15

  • PHPUnit 3.7.38

  • CakePHP 2.7.5


設定方法1

CakePHPの公式ドキュメントでは、withを使うことで引数の指定ができると紹介されています。

$Posts->Auth->staticExpects($this->any())

->method('user')
->with('id')
->will($this->returnValue(2));

この場合、引数にidが設定された時のmockを作成する方法を示しています。つまりソースコード上で$this->Auth->user('id')と書かれた動作のみを作ることになります。


設定方法2

設定方法1のだと、任意の引数が関数に渡った場合のmockを作ることはできません。任意の引数の場合にどのようにテストコードを書くのか調べました。

結論から言うと、以下のように->with($this->anything())を使えば解決します。

$Posts->SampleModel

->expects($this->any())
->method('methodName')
->with($this->anything()) #<-ここ
->will($this->returnValue('something'));

他にも、想定される引数を直接指定することでmockを作成できます。また、使用できる関数はPHPUnitのソースコードを読むことで確認できます。(sebastianbergmann/phpunit Asset.phpの下の方)

一部を以下に記載します。

$this->contains($value)

$this->arrayHasKey($key)
$this->equalTo($value, $delta, $maxDepth)
$this->classHasAttribute($attribute)
$this->greaterThan($value)
$this->isInstanceOf($className)
$this->isType($type)
$this->matchesRegularExpression($pattern)
$this->stringContains($string, $case)


参考