2012-02-22 11 views
28

私は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」のように見えます。

これを行うには適切な方法はありますか?

答えて

38

どの方法でも嘲笑を避けるために、nullsetMethods()に渡すことができます。空の配列を渡すと、すべてのメソッドがモックされます。後者は、あなたが見つけたメソッドのデフォルト値です。

これは、このクラスの設計上の欠陥を指摘するかもしれないと言われています。このメソッドを静的にするか、別のクラスに移動する必要がありますか?メソッドが完全に構築されたインスタンスを必要としない場合は、静的にすることができるユーティリティメソッドである可能性があります。

+3

ありがとうございました! setMethods(null)は私が望むものです。これにより、メソッドが嘲笑されることはありません。一方、setMethods(array())は、setMethods()をまったく使用しないのと同じように、すべてのメソッドを嘲笑するように見えます。私はどこにも書かれていない。あなたは "空の親"とはどういう意味ですか? –

+0

また、私はあなたのコメントに困惑しています。上記で提供した簡単なmyMethod()の例のほかに、なぜこのようにテストする必要があるメソッドを使用すると、そのメソッドを別のクラスに移動するか静的にする必要があるのでしょうか? –

+0

@BrianKendig - "括弧"であるべき "parents"のオートコレクトが失敗します。 :)私はソースをチェックしただけでデフォルトはないので、あなた自身で 'null'を渡す必要があります。 –

3

別のハックが、簡潔な解決策は嘲笑方法の一つとして、魔法のコンストラクタをリストするだけである:これは私のために働いた

$mock = $this->getMock('MyClass', array('__construct')); 
-8

$this->getMock($class, array(), array(), '', false); 
+0

ポイントが完全に欠落しています – dVaffection

0

それとも、単に直接getMock()を使用することができます。

$mock = $this->getMock('MyClass', null, array(), null, false);

+0

getMock()は非推奨です – krazyweb

+0

はい。私は受け入れられた答えに投票しました。 – Ryan

関連する問題