5

検索文字列を使用してスーパーマーケットを検索し、対応するアイテムを返すメソッド「getItem($itemNo)」を持つ「Search」クラスを取り込むクラスのテストを作成しています。

だから、このようなビット:

class MyClass 
{
    public function __construct(Search $search) {
        $item0 = $search->getItem(0);
        $item1 = $search->getItem(1);
        // etc... you get the picture
    }
}

テストを行うたびにスーパーマーケットを検索したくないので、この Search クラスをモックしたいと思います。

だから私は書いた:

class MyClassTest extends PHPUnit_Framework_TestCase 
{
    public function setUp()
    {
        $searchResults=$this->getMockBuilder('Search')
                            //Because the constructor takes in a search string:
                            ->disableOriginalConstructor() 
                            ->getMock();

        $pseudoSupermarketItem=array( "SearchResult1", "SearchResult2", etc...);

        $this->searchResult
               ->expects($this->any())
               ->method('getItem')
               ->with(/*WHAT DO I PUT HERE SO THAT THE METHOD WILL TAKE IN A NUMBER*/)
               ->will($this->returnValue($pseudoSupermarketItem[/* THE NUMBER THAT WAS PUT IN */]));
    }
}

コードでわかるように、MyClass に示されているように、モック メソッドが整数を取り、対応する pseudoSupermarketItem 文字列を返すようにしたいと考えています。これまでのところ、これを実現する方法がわかりません。助けていただければ幸いです。

4

2 に答える 2

7

これはあなたのために働くはずです:

$this->searchResult
    ->expects($this->any())
    ->method('getItem')
    ->with($this->isType('integer'))
    ->will($this->returnCallback(function($argument) use ($pseudoSupermarketItem) {
        return $pseudoSupermarketItem[$argument];
    });

さらに、役に立つかもしれません ( を使用onConsecutiveCalls):

http://phpunit.de/manual/3.7/en/test-doubles.html#test-doubles.stubs.examples.StubTest7.php

3番目の方法は次のようなものです。

$this->searchResult
    ->expects($this->at(0))
    ->method('getItem')
    ->with($this->equalTo(0))
    ->will($this->returnValue($pseudoSupermarketItem[0]);
$this->searchResult
    ->expects($this->at(1))
    ->method('getItem')
    ->with($this->equalTo(1))
    ->will($this->returnValue($pseudoSupermarketItem[1]);
// (...)
于 2013-09-13T15:33:44.760 に答える