46

PHPUnit のreturnValueMap()を使用して、読み取りの結果をスタブしようとしています。期待される結果は得られませんが、同等の returnCallback() は得られます。自分で調べたい場合は、テストケースを利用できるようにしました。

returnValueMap()

$enterprise = $this->getMock('Enterprise', array('field'));
$enterprise->expects($this->any())
    ->method('field')
    ->will($this->returnValueMap(array(
        array('subscription_id', null),
        array('name', 'Monday Farms')
    )));
$enterprise->subscribe('basic');

結果:

Subscription ID: NULL
Name: NULL

returnCallback()

$enterprise = $this->getMock('Enterprise', array('field'));
$enterprise->expects($this->any())
    ->method('field')
    ->will($this->returnCallback(function ($arg) {
        $map = array(
            'subscription_id' => null,
            'name' => 'Monday Farms'
        );
        return $map[$arg];
    }));
$enterprise->subscribe('basic');

結果:

Subscription ID: NULL
Name: string(12) "Monday Farms"

エンタープライズ::購読

public function subscribe() {
    echo 'Subscription ID: ';
    var_dump($this->field('subscription_id'));
    echo 'Name: ';
    var_dump($this->field('name'));
}

returnValueMap() が期待どおりに機能しないのはなぜですか? 私は正確に何が欠けていますか?

4

3 に答える 3

120

私は同じ問題を抱えていましたが、最終的に returnValueMap() がオプションのものを含む関数のすべてのパラメーターをマップし、次に目的の戻り値をマップする必要があることがわかりました。

Zend Framework の関数の例:

public function getParam($key, $default = null)
{
    $key = (string) $key;
    if (isset($this->_params[$key])) {
        return $this->_params[$key];
    }

    return $default;
}

次のようにマッピングする必要があります。

$request->expects($this->any())
        ->method('getParam')
        ->will($this->returnValueMap(array(array($param, null, $value))));

真ん中にヌルがないとうまくいきません。

于 2013-03-08T18:16:57.597 に答える
0

問題はコードの別の場所にあるか、古い PHPUnit バージョンの問題である可能性があります。

私にとっては、このコードを使用して動作します:

猫 EnterpriseTest.php

<?php

class EnterpriseTest extends PHPUnit_Framework_TestCase {

    public function testReturnValueMap() {
        $enterprise = $this->getMock('Enterprise', array('field'));
        $enterprise->expects($this->any())
            ->method('field')
            ->will($this->returnValueMap(array(
                array('subscription_id', null),
                array('name', 'Monday Farms')
            )))
        ;
        $enterprise->subscribe('basic');        
    }

}

class Enterprise {

    public function field($name) {
    }

    public function subscribe() {
        echo 'Subscription ID: ';
        var_dump($this->field('subscription_id'));
        echo 'Name: ';
        var_dump($this->field('name'));
    }

}

出力:

phpunit-dev EnterpriseTest.php 
PHPUnit 3.7.6 by Sebastian Bergmann.

.Subscription ID: NULL
Name: string(12) "Monday Farms"


Time: 0 seconds, Memory: 6.75Mb

OK (1 test, 1 assertion)

ですから、なぜうまくいかないのかはわかりませんが、少なくとも、あなたがそれを正しく行っており、returnValueMap正しく理解していることを伝えることができます :)

于 2012-10-08T09:26:27.343 に答える