2013-06-04 3 views
5

Я тестирую PHP код с помощью PHPUnit и у меня есть проблема:Как макет нового объекта в методе - PHPUnit

Я тестирование класс:

class ClassName 
{ 
    public function MethodName() 
    { 
    // something 

    $objectName = new Object(); 
    $variableName = $objectName->execute(); 

    // something 
    } 
} 

Я хочу создать макет объекта. Мне не нужен вызов real метода execute(). Я не знаю, как это сделать с phpunit. Я знаю инъекцию зависимостей, но ИМХО этот случай не решен с инъекцией зависимости.

Спасибо за ответы. Прошу прощения за мой английский.

ответ

5

Фактически, этот случай можно решить с помощью инъекции depency. Допустим, вы не создаете объект Object внутри MethodName, а вводите его. Независимо от того, работает ли это с помощью конструктора, сеттера или метода, это не имеет большого значения для принципа.

class ClassName 
{ 
    public function MethodName(Object $objectName) 
    { 
     // something 

     $variableName = $objectName->execute(); 

     // something 
    } 
} 

Потому что теперь вы не делаете instaniate объект внутри метода вы хотите проверить, вы можете передать его макет, если вы хотите, чтобы проверить его.

public function testMethodName(){ 
    $mock = $this->getMockBuilder('Object')->getMock(); 

    $className = new ClassName; 

    $result = $className->MethodName($mock); 

    $this->assertTrue($result); 
} 

Я не запускать эту TestMethod, но я думаю, что это иллюстрирует точку инъекции depency для контролируемости.

+0

Thans! Я должен думать о своем коде. – lukas888

+0

Я сам не эксперт. Я действительно думаю, что письменные тесты также делают код чище, потому что вы лучше думаете о его структуре. http://youtu.be/RlfLCWKxHJ0 и http://youtu.be/-FRm3VPhseI - хорошие общие переговоры, а http://www.slideshare.net/fabpot/dependency-injection-with-php-53 для описания вставка аргумента от создателя Pimple и других замечательных проектов ... – qrazi

+0

Я думаю, что эта стратегия не всегда уместна. Например, если объект, который должен быть создан в тестируемом методе, это что-то вроде \ DateTime(). Или объект события, который передается диспетчеру событий. – Brian