Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 模拟对象后是否缺少函数?_Php_Mocking_Phpunit - Fatal编程技术网

Php 模拟对象后是否缺少函数?

Php 模拟对象后是否缺少函数?,php,mocking,phpunit,Php,Mocking,Phpunit,诚然,我对使用模拟对象非常陌生,但遇到了一种奇怪的行为,我希望有人能向我解释 我有两个类A和B。B扩展了A,看起来像这样 abstract class A { private $property public __constructor( $arg ) { //sets and does constructor stuff } public function a() {

诚然,我对使用模拟对象非常陌生,但遇到了一种奇怪的行为,我希望有人能向我解释

我有两个类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。现在从我的理解来看,即使我错误地创建了mock对象,并且函数c已经变成了存根方法,而不是mock方法,它仍然是可调用的,对吗?进行一些调试,以确认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'
)

有人知道我的这个类的其他方法发生了什么事情,或者解释了这个行为吗?

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

这里只是一个旁注:B中的
\uuu构造()
违反了严格的标准,因为它的参数与a中的
\uu构造()
不同。这会导致上面的问题还是更多的是编码偏好?这就是我为什么说“旁注”;-)这与您的问题无关,如果启用了严格的标准,它只会使您的服务器崩溃。但是在这种情况下你会得到一个非常清楚的错误信息。嗯,我不知道。很高兴知道。但这段代码实际上来自我正在进行的一个个人项目,完全是供私人使用的,所以这不应该成为一个问题。您使用的是哪个版本的PHPUnit?关于旁注:这实际上取决于如何解释Liskov替换原则()现在我在上面为类发布了代码,每个类实际上都在自己的文件中。在测试类中,我只包含了类B,所以你认为这导致了这个问题,即使B.php包含了A.php本身?我只是想在将帖子标记为已解决之前进行验证。我假设测试类根本不包含A类和B类的include。我的演示与您的包括选项仍在工作,所以我不知道您的问题的原因。很抱歉给您带来不便。