PHPUnit模拟抽象父方法

时间:2014-04-01 19:34:57

标签: php phpunit

我必须测试类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;
}
我没有'知道如何禁用父类的构造函数,如果我这样做。

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
}