我有以下单元测试代码:
$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),这些是位置索引。
我尝试用 ->any() 替换 ->at(),但没有运气 - 我收到 PHPUnit 断言错误“断言两个字符串相等时失败”。- 预期的“__isset”与实际的“setDI”不匹配。
问题:
无论调用顺序如何,我如何告诉存根的预期方法工作?
谢谢, Temuri