这是我的课:
public function __construct(Manager $moduleManager, Source\Yesno $yesNo)
{
$this->moduleManager = $moduleManager;
$this->yesNo = $yesNo;
}
public function my1()
{
$this->moduleManager->isOutputEnabled('');
$this->yesNo->toOptionArray();
}
public function my2()
{
$this->moduleManager->isOutputEnabled('');
$this->yesNo->toOptionArray();
}
这是我的测试:
...
$this->observerMock = $this->getMock(
'path\to\Observer',
null,
[$this->moduleManagerMock, $this->yesNoMock],
'',
true
);
...
public function testMy1()
{
$this->moduleManagerMock->expects($this->exactly(2))->method('isOutputEnabled');
$this->yesNoMock->expects($this->exactly(2))->method('toOptionsArray');
$this->observerMock->my1();
$this->observerMock->my2();
}
测试返回:
方法名称的预期失败等于调用 2 次。方法预计被调用 2 次,实际上被调用 0 次。
我的问题是:我遇到过几次这样的事情,但每次我都无法理解发生了什么。为什么第一个期望是正确的,第二个是不正确的?
更新.1
我忘了说我几次遇到这种情况。这是我注意到的。使用 xDebug 我在测试中看到了
[this]
[moduleManager] => ModuleManager_Mock_Name_<hash #1>
[yesNo] => YesNo_Mock_Name_<hash #2>
[observerObject] =>
[moduleManager] => ModuleManager_Mock_Name_<hash #1>
[yesNo] => YesNo_Mock_Name_<hash #3> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
moduleManager 对象在 unittest 对象和观察者对象内部具有相同的缓存。如果我在 moduleMatcher 上应用 smth - 它出现在两个地方
$unittest->yesNo 的哈希值与 $observerObject 哈希值不同。如果我为某些方法设置匹配器 - 它仅适用于 unittest 类!
为什么会这样?如何防止创建不同的对象
Upd.2 找到了!
当您通过对象管理器创建对象时
$this->observerMock = $objectManager->getObject(
'Observer',
[
'moduleManager' => $this->moduleManagerMock,
'yesNo' => $this->yesNoMock,
]
);
变量 'moduleManager' 和 'yesNo' 应该与构造函数中的变量相同:
public function __construct(Manager $moduleManager, Source\Yesno $yesNo)
{
$this->moduleManager = $moduleManager;
$this->yesNo = $yesNo;
}
这是phpunit检查的代码:
foreach ($method->getParameters() as $parameter) {
$parameterName = $parameter->getName();
$argClassName = null;
$defaultValue = null;
if (array_key_exists($parameterName, $arguments)) {
$constructArguments[$parameterName] = $arguments[$parameterName];
continue;
}