Создать экземпляр объекта с абстрактными параметрами


interface aInterface{
     public function __construct(aClass_Abstract $a, bClass_Abstract $b){
     }
}
class Sample implements aInterface
{
     public function __construct(aClass_Abstract $a, bClass_Abstract $b){
         //implementation
         $this->init();
     }
     public function init(){
         //implementation
     }
}

Как настроить это при тестировании с помощью PHPUnit?

...реализация... тест

...
function setUp(){
    //initialize
}
Author: Efox, 2011-04-14

3 answers

В двух словах: Используйте getMockForAbstractClass чтобы создать поддельный экземпляр из классов, которые вам нужно пройти, чтобы вы могли их протестировать.

$a = $this->getMockForAbstractClass("aClass_Abstract");
$b = $this->getMockForAbstractClass("bClass_Abstract");
$class = new Sample($a, $b);

Пример полного кода

(Исправлено определение интерфейса)

<?php

interface aInterface{
     public function __construct(aClass_Abstract $a, bClass_Abstract $b);
}
class Sample implements aInterface
{
     public function __construct(aClass_Abstract $a, bClass_Abstract $b){
         //implementation
         $this->a = $a;
     }
     public function init(){
         return $this->a->myMethod();
     }
}

abstract class aClass_Abstract {
    abstract public function myMethod();
}

abstract class bClass_Abstract {}

class SampleTest extends PHPUnit_Framework_TestCase {

    public function testSetup() {

        $a = $this->getMockForAbstractClass("aClass_Abstract");
        $a->expects($this->once())->method("myMethod")->will($this->returnValue(true));
        $b = $this->getMockForAbstractClass("bClass_Abstract");
        $class = new Sample($a, $b);
        $this->assertTrue($class->init());

    }
}


/*
PHPUnit 3.5.12 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.25Mb
*/
 4
Author: edorian, 2011-04-14 07:34:44

Предполагая, что вы хотите протестировать Sample, вы будете использовать Заглушки или насмешки:

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function testSomething()
    {
        $stubA = $this->getMockForAbstractClass('aClass_Abstract');
        $stubA->expects($this->any())
              ->method('abstractMethod')
              ->will($this->returnValue(TRUE));

        // do the same for bClass_Abstract

        $sample = new Sample($stubA, $stubB);
        // add an assertion for sample
    }
}

Цитирование Руководства PHPUnit по getMockForAbstractClass:

Метод getMockForAbstractClass() возвращает макет объекта для абстрактного класса. Все абстрактные методы данного абстрактного класса высмеиваются. Это позволяет тестировать конкретные методы абстрактного класса.

Смотрите эту главу для получения дополнительной информации о тестовых двойниках и для получения дополнительной информации о Издевательство с помощью PHPUnit

 2
Author: Gordon, 2017-05-23 10:33:13

Вероятно, вы ищете фиктивные объекты.

Http://www.phpunit.de/manual/3.6/en/test-doubles.html

Https://github.com/padraic/mockery

 0
Author: KingCrunch, 2011-04-14 07:19:45