【发布时间】:2012-03-17 13:21:43
【问题描述】:
在 phpunit 中我们可以指定具体调用的方法
->with($this->equalTo('foobar'))
或任何
->with($this->anything())
参数。
但是有没有办法指定该方法是在没有参数的情况下调用的?
这是我预计会失败的测试:
public function testZ()
{
$a = $this->getMock('q');
$a->expects($this->once())
->method('z')
->with(); // <--- what constraint to specify here?
$a->z(1);
}
UPD:
这个问题具有理论性质,所以我没有任何现实生活中的例子。我现在能想到的一些可能有用的情况是:
public function testMe($object)
{
$object->foo();
}
让我们假设testMe 应该(根据设计和要求)始终调用不带参数的方法(假设foo() 具有默认参数)。因为在这种情况下,任何非默认参数(更准确地说:任何参数 != 到默认参数,我们还不知道并且可能会独立更改)都会导致致命的后果。
【问题讨论】:
-
+1 我花了几分钟在 github 上浏览 PHPUnit 源代码,似乎
->with()仅用于实际指定参数,而不是禁止它们。不过,我真的想不出一种情况,即验证没有传递任何参数是您需要检查的事情?我很想知道您为什么需要验证没有发送任何参数。在没有预期的情况下传递一个参数不会破坏任何东西,当有一个预期无法提供的参数时,你不能只传递一个 NULL 吗? -
@rdlowrey:添加了解释更新 ;-)
-
@rdlowrey:
can't you just pass in a NULL when there is an argument expected that can't be provided--- 不,你不能。方法仍然可以有可选参数 -
是的......我在阅读您的更新后尝试从我的评论中重新编辑该声明,但 5 分钟窗口已经过去;)我希望我可以 +5 这个问题,因为我我也想知道并且从查看源代码中我找不到在这种情况下有效的约束。您可能需要超出 PHPUnit 内置功能的范围,并使用您自己的模拟类扩展被测类,如果参数被传递给方法,则会引发异常或其他东西......
-
@rdlowrey:我会接受
it is impossible作为有效答案,只要经过一些代码研究我也看不到任何可能性。
标签: php unit-testing testing phpunit