1

次のようなコードがあります。

public function foo(Bar $bar) {
    if ($bar instanceof Iterator) {
        //...
    }
}

これをテストするには、次を使用しています。

$this->getMock('Bar');

ただし、私のコードは Iterator を実装する Bar のインスタンスを探しているため、基本的に 2 つの型があります。getMock('Bar') または getMock('Iterator') を呼び出すと、コードはテストできなくなります。

モックにインターフェイスを実装させるにはどうすればよいですか? これは可能でなければなりませんね。

4

2 に答える 2

3

何かをモックすると、モックするように指示したクラスのサブクラスPHPUnitが作成されます。

BarIterator を実装する場合は、IteratorBarMockも実装します。

サンプル.php

<?php

interface myInterface {

    public function myInterfaceMethod();

}

class Bar implements myInterface {

    public function myInterfaceMethod() {
    }

}

class TestMe {

    public function iNeedABar(Bar $bar) {
        if ($bar instanceOf myInterface) {
            echo "Works";
        }
    }
}

class TestMeTest extends PHPUnit_Framework_TestCase {

    public function testBar() {
        $class = new TestMe();
        $bar = $this->getMock('Bar');
        $class->iNeedABar($bar);
    }

}

出力:

phpunit Sample.php 
PHPUnit 3.7.8 by Sebastian Bergmann.

.Works

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 0 assertions)
于 2012-11-01T15:51:55.293 に答える