4

来自 Google Mock 的背景,我很惊讶这不起作用,除非我做错了。

我只是想确保永远不会使用特定的类类型调用方法,但可能会为其他类类型调用方法。所以这是我拥有的代码,它解释了我想要什么:

$this->entityManagerMock
      ->expects($this->any())
      ->method('persist');
$this->entityManagerMock
     ->expects($this->never())
     ->method('persist')
     ->with($this->isInstanceOf('MySpecificClass'));

现在我收到类似这样的消息:

Doctrine\ORM\EntityManager::persist(DifferentClassType Object (...)) was not expected to be called.

当我期望第一个期望来处理它时。

我试过了,但结果是一样的:

$this->entityManagerMock
      ->expects($this->any())
      ->method('persist')
      ->with($this->anything());
$this->entityManagerMock
     ->expects($this->never())
     ->method('persist')
     ->with($this->isInstanceOf('MySpecificClass'));

这是我第一次在 PHPUnit 中使用模拟,但在我看来它with已经损坏和/或没有用。我知道现在大多数 Web 开发人员都使用 TDD,所以必须有更好的方法来做到这一点。

4

1 回答 1

2

作为一种解决方法,您可以使用returnCallback

$this->entityManagerMock
     ->expects($this->any())
     ->method('persist')
     ->will($this->returnCallback(function ($object) {
         self::assertNotInstanceOf('MySpecificClass', $object);
     }));
于 2012-04-20T21:40:59.457 回答