次の単体テスト コードがあります。
$map = [
'key1' => 'A',
'key2' => 'B'
];
$stub = $this->getMockBuilder('Phalcon\Session\Bag')
->setConstructorArgs([$sessionNamespace])
->getMock();
$stub->expects($this->at(0)) // Always called first by: new Phalcon\Session\Bag()
->method('setDI')
->will($this->returnCallback(function($di) {
$this->di = $di;
}));
$stub->expects($this->at(1)) // First, we're checking if session key is set
->method('__isset')
->will($this->returnCallback(function($sessionKey) {
// Yes, always set
return true;
}));
$stub->expects($this->at(2)) // Then, we're fetching it
->method('__get')
->will($this->returnValueMap($map));
Phalcon\Session\Bag で __isset($key) または __get($key) が呼び出されるたびに、マップされた値を返そうとしています。
最初の呼び出しでは、すべてが期待どおりに機能します。
$bag = new Phalcon\Session\Bag('someNamespace');
$var1 = (isset($bag->key1)) ? $bag->key1 : null; // $val1 is 'A'
ただし、後続の呼び出しはすべて NULL を返します。
$var2 = (isset($bag->key2)) ? $bag->key2 : null; // $val1 is NULL
$var3 = (isset($bag->key1)) ? $bag->key1 : null; // $val1 is NULL
明らかに、問題は->at(0|1)にあり、これらは位置インデックスです。
->at() を ->any() に置き換えようとしましたが、うまくいきませんでした - PHPUnit アサーション エラー "Failed asserting that two strings are equal." が発生しました。- 予想される「__isset」が実際の「setDI」と一致しません。
質問:
呼び出し順序に関係なく、スタブの予想されるメソッドが機能するようにするにはどうすればよいですか?
ありがとう、てむり