我必须测试类add_Hook
class add_Hook extends Hooks_base
我试图像这样创建一个hooks_base的模拟:
> $this->oHookBaseMock = $this->getMock(
> 'Hooks_base',
> array('get_database','get_arguments'),
> array(null,'null') //this are the parameters for the constructor
> );
$this->hook->expects($this->any())
->method('get_database')
->will( $this->returnValue(true)
);
$this->hook->expects($this->any())
->method('get_arguments')
->will( $this->returnValue($arraySImpleXmlObject)
);
做这样的事情:
$hook = new add_Hook($this->hook)
现在我的问题是,当我运行测试时,钢材会问我父类的2个参数(hooks_base)
构造函数是这样的
public function __construct($parameter_1, $parameter_2) {
$this->_param1 = $parameter_1;
$this->_param2 = $parameter_2;
}
我没有'知道如何禁用父类的构造函数,如果我这样做。
答案 0 :(得分:0)
我只是在测试中创建一个抽象类的实例。 $ Object = new ABSTRACT_CLASS()并且在需要定义的方法的定义中没有代码,因为我不打算测试抽象方法。
class TestAbstractInput extends AbstractInput
{
public ImplementAbstractFunction()
{ // Purposely empty so nothing happens. This would be defined in normal class extending AbstractInput
}
...
}
class AbstractInputTest extends TestCase
{
// ...
public function setUp()
{
$this->TestClassObject = new TestAbstractInput();
}
public function test_isValid()
{
$this->assertEquals(1, $this->TestClassObject->isValid);
}
}
这样可以测试各个方法。然后我测试通常扩展抽象类的普通类,以测试在该类中实现的函数。
class InputTest extends TestCase
{
// ...
public function setUp()
{
$this->TestClassObject = new AbstractInput();
}
// Parent function should still work
public function test_isValid()
{
$this->assertEquals(1, $this->TestClassObject->isValid);
}
public function test_ImplementAbstractFunction()
{
$this->assertTrue($this->AbstractFunction());
...
}
}
编辑还有内置的getMockForAbstractClass(),如果您使用的是足够新的版本,它可以直接为您工作。您还可以指示Mocks不运行构造函数。
答案 1 :(得分:0)
您无法“模拟”您班级的家长班级。您可以创建一个类的模拟,并替换您想要替换的父方法。
$add_hook = $this->getMock('add_Hook',
//This will mock these methods only and leave the rest untouched provided the class is able to be loaded.
array('get_database','get_arguments'),
array(param1, param2));
$this->hook->expects($this->any())
->method('get_database')
->will( $this->returnValue(true)
);
$this->hook->expects($this->any())
->method('get_arguments')
->will( $this->returnValue($arraySImpleXmlObject)
);
你的尝试是以某种方式将父母注入课堂。该类是父类的一个实例,因此您不能在不模仿类本身的情况下“模拟”它。
在我看来,这不是一个好习惯。您正在测试类的实现,而不是测试类的行为。您的测试应该检查您的方法的作用而不是它是如何做的。什么是'get_database'和'get_arguments'呢?也许你应该将'Hooks_base'的实例传递给你的类而不是扩展它。
根据您发布的内容,我的测试结果如下:
public function testInit() {
$param1 = <what ever the argument needs to be>;
$param2 = <something else>;
$addHook = new add_Hook($param1, $param2);
$this->assertInstanceOf('Hooks_base', $addHook); //I would probably have this in a constructor test
$addHook->init();
//Assertions for what init() does
}