7

PHPUnitモックのexpects()をリセットするにはどうすればよいですか?

テスト内で複数回呼び出したいSoapClientのモックがあり、各実行の期待値をリセットします。

$soapClientMock = $this->getMock('SoapClient', array('__soapCall'), array($this->config['wsdl']));
$this->Soap->client = $soapClientMock;

// call via query
$this->Soap->client->expects($this->once())
    ->method('__soapCall')
    ->with('someString', null, null)
    ->will($this->returnValue(true));

$result = $this->Soap->query('someString'); 

$this->assertFalse(!$result, 'Raw query returned false');

$source = ConnectionManager::create('test_soap', $this->config);
$model = ClassRegistry::init('ServiceModelTest');

// No parameters
$source->client = $soapClientMock;
$source->client->expects($this->once())
    ->method('__soapCall')
    ->with('someString', null, null)
    ->will($this->returnValue(true));

$result = $model->someString();

$this->assertFalse(!$result, 'someString returned false');
4

1 に答える 1

7

もう少し調査すると、expect() をもう一度呼び出すだけのようです。

ただし、この例の問題は $this->once() の使い方です。テストの間、expects() に関連付けられたカウンターはリセットできません。これに対抗するには、いくつかのオプションがあります。

最初のオプションは、$this->any() で呼び出される回数を無視することです。

2 番目のオプションは、$this->at($x) を使用して呼び出しをターゲットにすることです。$this->at($x) は、特定のメソッドではなく、モック オブジェクトが呼び出される回数であり、0 から始まることに注意してください。

私の具体的な例では、模擬テストはどちらの場合も同じで、2 回しか呼び出されないと予想されるため、expects() ステートメントを 1 つだけ使用して $this->exactly() を使用することもできます。すなわち

$soapClientMock = $this->getMock('SoapClient', array('__soapCall'), array($this->config['wsdl']));
$this->Soap->client = $soapClientMock;

// call via query
$this->Soap->client->expects($this->exactly(2))
    ->method('__soapCall')
    ->with('someString', null, null)
    ->will($this->returnValue(true));

$result = $this->Soap->query('someString'); 

$this->assertFalse(!$result, 'Raw query returned false');

$source = ConnectionManager::create('test_soap', $this->config);
$model = ClassRegistry::init('ServiceModelTest');

// No parameters
$source->client = $soapClientMock;

$result = $model->someString();

$this->assertFalse(!$result, 'someString returned false');

$this->at() および $this->exactly() を支援したこの回答に対する称賛

于 2012-04-27T01:35:15.210 に答える