模拟对象后,缺少函数?

时间:2014-06-24 07:02:45

标签: php mocking phpunit

不可否认,我对使用模拟对象非常陌生,但遇到了一种奇怪的行为,我希望有人可以向我解释。

我有两个类A类和B类.B扩展A并看起来像这样。

    abstract class A {

        private $property

        public __constructor( $arg ) {
                //sets and does constructor stuff
        }

        public function a() {
        //does stuff
    }

    public function b() {
        //does more stuff
    }

    public function c() {
        //calls b and does stuff
    }

}

class B extends A {

    const MyCONST = //some literal

    public __constructor() {
        parent::__constructor( self::MyCONST );
    }

}

由于我的A类是抽象的,我正在对B类进行测试。当测试函数c时,我需要存根函数b,所以我在测试中完成了以下操作。

$objectUnderTest = $this->getMockBuilder( 'B' )
            ->setMethods( array( 'b' ) )
            ->getMock();

$objectUnderTest->expects( $this->once() )
        ->method( 'b' )
        ->will( $this->returnValue( 5 ) );

$result = $objectUnderTest->c();

//then some assertions

我遇到的问题是,当执行以下测试代码时,PHPUnit会抱怨它无法找到$ objectUnderTest的方法c。现在从我的理解,即使我已经错误地创建了模拟对象,并且函数c已经成为存根方法而不是模拟方法,它仍然可以调用吗?一些调试确认了PHPUnit告诉我的内容我在模拟对象以及类B的普通实例上输出了get_class_methods()的结果。这是它为每个输出的结果。

//class B
array(
    (int) 0 => '__construct',
    (int) 1 => 'a',
    (int) 2 => 'b',
    (int) 3 => 'c'
)

//mocked B
array(
    (int) 0 => '__clone',
    (int) 1 => 'b',
    (int) 2 => 'expects',
    (int) 3 => 'staticExpects',
    (int) 4 => '__phpunit_getInvocationMocker',
    (int) 5 => '__phpunit_getStaticInvocationMocker',
    (int) 6 => '__phpunit_hasMatchers',
    (int) 7 => '__phpunit_verify',
    (int) 8 => '__phpunit_cleanup'
)

有谁知道我的其他方法发生了什么,或解释这种行为?

1 个答案:

答案 0 :(得分:0)

我在尝试运行代码时遇到了同样的问题,因此我将包含类(A和B)的文件包含在测试类中。它帮助我克服了这个问题。