12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-08

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)

参考

12
9
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?