来自https://phpunit.de/manual/current/en/test-doubles.html:
// Set up the expectation for the update() method
// to be called only once and with the string 'something'
// as its parameter.
$observer->expects($this->once())
->method('update')
->with($this->equalTo('something'));
如果->with()
应该代表传递的参数而不是$this->equalTo
为什么需要?在那里可以使用哪些其他方法,为什么会有人想要?因为看起来这种调用模拟更新方法的方法不必要地简洁,最好写成->with('something')
。
为什么你必须做->expects($this->once())
以确保只调用一次方法?如果你调用一个方法/方法模拟一次突然怎么会被多次调用?
如果我做strpos()
它不会被调用5次 - 它将被调用一次。说->expects($this->once())
似乎没必要。
答案 0 :(得分:1)
您需要$this->equals
参数中的->with()
,因为您可以指定不同的断言来检查参数。您不必为该方法设置$this->with()
,这意味着没有参数或您不关心它们。
我将定期使用的是$this->isInstanceOf()
,用于检查传递给模拟方法的对象类型。
与$this->once()
类似,有很多方法可以指定调用mock的次数。
https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects.tables.matchers
如果你不关心多少次只使用$this->any()
(虽然如果没有调用该方法,这将会通过)。我倾向于使用$this->exactly()
和$this->once()
,以便我确保该方法被称为我期望的次数。对于测试错误情况,$this->never()
在与快乐路径测试配对时尤其有用。因此,我指定在出现问题时不应该采取哪些步骤。
必须指定调用方法的次数似乎有点过分,但如果您正在编写数据或执行资源密集型操作,那么您将需要确保它只执行一次而不是5x会影响表现。指定一次可确保如果某人修改了您的代码并再次调用该方法,则测试将失败。