检查mock的方法是否被调用,没有任何参数传递(在phpunit中)

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了检查mock的方法是否被调用,没有任何参数传递(在phpunit中)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
PHPunIT中,我们可以指定特定的方法
->with($this->equalTo('foobar'))

或任何@H_304_4@

->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本身.

首先,如果您的方法不提供认值,如果您没有传递任何参数,解释器将引发致命错误.这是预期的,与手头的问题并不完全相关,但重要的是要向前推进.

其次,如果您的方法提供认值,调用不带参数的方法将导致PHPPHPUnit涉及到之前改变调用,以传递认值.这是一个简单的测试,它演示了PHPPHP可以检查参数之前插入自身.这是关键,认识到,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).

如果你能提供一个真实的,具体的例子,你真的需要做这种测试,值得花点时间思考一下解决方案.在此之前,我对纯粹的“不要这样做”的学回答感到满意.

本图文内容来网友网络收集整理提供,作为学习参考使用,版权属于原作者。

脚本宝典总结

以上是脚本宝典为你收集整理的检查mock的方法是否被调用,没有任何参数传递(在phpunit中)全部内容,希望文章能够帮你解决检查mock的方法是否被调用,没有任何参数传递(在phpunit中)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。