试图了解期望/与phpunit

时间:2014-11-04 14:25:23

标签: php mocking phpunit

来自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())似乎没必要。

1 个答案:

答案 0 :(得分:1)

您需要$this->equals参数中的->with(),因为您可以指定不同的断言来检查参数。您不必为该方法设置$this->with(),这意味着没有参数或您不关心它们。

https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertThat.tables.constraints

我将定期使用的是$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会影响表现。指定一次可确保如果某人修改了您的代码并再次调用该方法,则测试将失败。