在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()具有默认值).因为任何非默认参数(更精确:任何参数!=默认值,我们还不知道,哪些可能会独立更改)在这种情况下会导致致命的后果.
虽然rdlowrey是正确的,with()没有规定检查没有参数传递,但问题并不在于PHPUnit,而是PHP本身.
首先,如果您的方法不提供默认值,如果您没有传递任何参数,解释器将引发致命错误.这是预期的,与手头的问题并不完全相关,但重要的是要向前推进.
其次,如果您的方法提供默认值,调用不带参数的方法将导致PHP在PHPUnit涉及到之前改变调用,以传递默认值.这是一个简单的测试,它演示了PHP在PHP可以检查参数之前插入自身.这是关键,认识到,PHP创建的模拟类具有与嘲笑类相同的签名 – 包括默认值.
class MockTest extends PHPUnit_Framework_TestCase { public function test() { $mock = $this->getMock('Foo',array('bar')); $mock->expects($this->once()) ->method('bar') ->with() // does nothing,but it doesn't matter ->will($this->returnArgument(0)); self::assertEquals('foobar',$mock->bar()); // PHP inserts 1 and 2 // assertion fails because 1 != 'foobar' } } class Foo { public function bar($x = 1,$y = 2) { return $x + $y; } }
这意味着您可以验证没有传递任何信息或默认值已通过,但您不能更具体.
你能解决这个限制吗?您可以在覆盖方法时从参数中删除默认值,因此您应该能够创建一个子类并模拟它.这值得么?我最初的反应是,这是一个巨大的代码气味.您的设计或测试都在做错事(tm).
如果你能提供一个真实的,具体的例子,你真的需要做这种测试,值得花点时间思考一下解决方案.在此之前,我对纯粹的“不要这样做”的学术回答感到满意. 原文链接:https://www.f2er.com/php/139435.html