私はPHPUnitで私のPHPコードをユニットテストしていますが、私はそのメソッドを嘲笑せずにオブジェクトをモックする正しい方法を理解しようとしています。方法を嘲笑せずにphpunitでモックを作成していますか?
私がgetMockBuilder()->setMethods()
を呼び出さないと、オブジェクトのすべてのメソッドがモックされ、テストしたいメソッドを呼び出せないという問題があります。私がの場合を呼び出す場合は、どのメソッドを偽るべきかを教えておく必要がありますが、どのメソッドも全く模倣したくありません。しかし、私はテストでコンストラクタを呼び出すことを避けるためにモックを作成する必要があります。ここで
は、私がテストしたいと思います方法の簡単な例です:
class Foobar
{
public function __construct()
{
// stuff happens here ...
}
public function myMethod($s)
{
// I want to test this
return (strlen($s) > 3);
}
}
私はmyMethod()
をテストすることがあります
$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
しかし、これは、私はそうでない、FOOBARのコンストラクタを呼び出します欲しいです。だからではなく、私が試してみた:
$obj = $this->getMockBuilder('Foobar')->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
しかしsetMethods()
を使用せずにgetMockBuilder()
を呼び出すと嘲笑されているすべてのメソッドになりますし、nullを返すが、そうmyMethod()
に私の呼び出しは、私がテストする予定のコードに触れることなくnullを返します。
私の回避策は、これまでのところ、これをされています:
$obj = $this->getMockBuilder('Foobar')->setMethods(array('none'))
->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
これは、存在しない「どれも」という名前のない方法を、模擬ますが、PHPUnitは気にしません。私はそれを呼び出すことができるように、myMethod()をモックロックしたままにします。また、私はそれを呼び出さないようにコンストラクタを無効にします。完璧!それは、存在しないメソッド名を指定しなければならないことを浮気していることを除いて、「none」、「blargh」、「xyzzy」のように見えます。
これを行うには適切な方法はありますか?
ありがとうございました! setMethods(null)は私が望むものです。これにより、メソッドが嘲笑されることはありません。一方、setMethods(array())は、setMethods()をまったく使用しないのと同じように、すべてのメソッドを嘲笑するように見えます。私はどこにも書かれていない。あなたは "空の親"とはどういう意味ですか? –
また、私はあなたのコメントに困惑しています。上記で提供した簡単なmyMethod()の例のほかに、なぜこのようにテストする必要があるメソッドを使用すると、そのメソッドを別のクラスに移動するか静的にする必要があるのでしょうか? –
@BrianKendig - "括弧"であるべき "parents"のオートコレクトが失敗します。 :)私はソースをチェックしただけでデフォルトはないので、あなた自身で 'null'を渡す必要があります。 –