不可否认,我对使用模拟对象非常陌生,但遇到了一种奇怪的行为,我希望有人可以向我解释。
我有两个类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'
)
有谁知道我的其他方法发生了什么,或解释这种行为?
答案 0 :(得分:0)
我在尝试运行代码时遇到了同样的问题,因此我将包含类(A和B)的文件包含在测试类中。它帮助我克服了这个问题。