PHPUnit断言没有调用任何方法

时间:2013-09-11 15:14:13

标签: php unit-testing testing mocking phpunit

我有一个使用ServiceB的ClassA。在某种情况下,ClassA最终不应该调用任何ServiceB方法。我现在想测试这个并且确实没有确实调用任何方法。

这可以按如下方式完成:

$classA->expects( $this->never() )->method( 'first_method' );
$classA->expects( $this->never() )->method( 'second_method' );
...

有没有办法简单地说“不应该在这个对象上调用方法”,而是必须为每个方法指定一个限制?

3 个答案:

答案 0 :(得分:48)

是的,这很简单,试试这个:

$classA->expects($this->never())->method($this->anything());

答案 1 :(得分:1)

您可以使用方法MockBuilder::disableAutoReturnValueGeneration

例如,在您的测试中,覆盖默认的TestCase::getMockBuilder

    /**
     * @param string $className
     * @return MockBuilder
     */
    public function getMockBuilder($className): MockBuilder
    {
        // this is to make sure, that not-mocked method will not be called
        return parent::getMockBuilder($className)
            ->disableAutoReturnValueGeneration();
    }

优势:

  • 除了模拟方法外,所有模拟都不会调用任何东西。无需将->expects(self::never())->method(self::anything())绑定到所有
  • 您仍然可以设置新的模拟。 ->expects(self::never())->method(self::anything())之后,您不能

适用于PhpUnit v7.5.4(以及以后的版本)。

答案 2 :(得分:0)

您还可以模拟方法和数据提供程序,并确保永远不会调用它。没有做出任何断言,因为它没有被调用,这意味着它已经通过了测试。

<?php
    /**
     * @dataProvider dataProvider
     */
    public function checkSomethingIsDisabled( $message, $config, $expected)
    {
        $debugMock = $this->getMockBuilder('APP_Class_Name')
            ->disableOriginalConstructor()
            ->setMethods(array('_helper'))
            ->getMock();

        $debugMock = $this->getPublicClass($debugMock);
        $debugMock->_config = $config;
        $viewContent = new stdClass;
        $debugMock->_functionToTest($viewContent);
    }

    public function dataProvider()
    {
        return [
                'dataset'=>
                    [
                        'message' => 'Debug Disabled',
                        'config' => (object) array(
                            'values' => (object) array(
                                'valueThatWhenFalseDoesntExecuteFunc'=> false
                            )
                        ),
                        // in a probably needed complimentary "imaginary" test we probably  
                        // will have the valueThatWhenFalseDoesntExecuteFunc set to true and on
                        // expected more information to handle and test.
                        'expected' => null
                    ]
                ];
    }