2015-11-18 6 views
2

Я читал руководство PHPUnit, и есть одна часть, я просто не могу понять, что делать с издевательскими чертами (figure 9.18).PHPUnit mocking traits

В их примере есть конкретный метод, который возвращает значение из абстрактного метода (который в конечном итоге издевается над тестом).

К сожалению, объяснение 2 предложения не объясняет, почему это полезно! Насколько я могу судить, тест, очевидно, пройдет, но в реальном мире абстрактный метод не будет издеваться, и на самом деле это провалится?

Мы собираемся удалить абстрактный метод и заменить вызов его конкретным методом? Если да, то в чем смысл теста? Почему мы загромождаем черты абстрактными методами, которые на самом деле не используются?

Вопрос о том, почему тест должен пройти тестирование, если он используется в реальном мире, это провалится? Если бы кто-то мог помочь мне понять это, было бы признательно!

ответ

1

я слегка изменен пример за ссылку, чтобы разоблачить то, что на самом деле тесты тест:

<?php 
trait AbstractTrait 
{ 
    public function concreteMethod() 
    { 
     // this is the only logic which is being tested in testConcreteMethod test 
     $result = $this->abstractMethod() * 2; 

     return $result; 
    } 

    /** 
    * @return int 
    */ 
    public abstract function abstractMethod(); 
} 

class TraitClassTest extends PHPUnit_Framework_TestCase 
{ 
    public function testConcreteMethod() 
    { 
     $mock = $this->getMockForTrait('AbstractTrait'); 

     $mock->expects($this->any()) 
      ->method('abstractMethod') 
      ->will($this->returnValue(5)); 

     $this->assertEquals(10, $mock->concreteMethod()); 
    } 
} 

Если реализация AbstractTrait::concreteMethod изменений, например, до

public function concreteMethod() 
    { 
     $result = $this->abstractMethod() * 3; 

     return $result; 
    } 

Испытание не удастся.

Чтобы быть абсолютно честным, я никогда не использовал черты с абстрактными методами в реальной живой и проверенной логике признаков, проверяя один из классов, которые используют черту. Как и в примере выше, было бы невозможно протестировать AbstractTrait::concreteMethod в изоляции без издевательских абстрактных методов.

+0

А я вижу, пример для черт, которые на самом деле * используют * абстрактные методы в реальном мире? Я думаю, что я смущался, думая, что абстрактные методы были * необходимы только для теста (и поэтому не применимы в реальном мире). Спасибо :) –

+0

Я не уверен, где это хорошая практика или нет, представьте, что вы тестируете только эту черту, но не класс, использующий ее, в один прекрасный день вы решили удалить ее из этого класса ... так внезапно ваш код останавливается как это было, и вы не будете знать, почему, потому что вы не тестировали его на реальном классе. Поэтому всегда проверяйте поведение своего класса, когда дело доходит до его использования. – itsjavi

Смежные вопросы