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)