Фиктивный метод PHPUnit из другого класса

#php #mocking #phpunit

Вопрос:

С помощью PHPUnit 6.5.14 я пытаюсь протестировать метод. Для этого нужно высмеять одну из его зависимостей; однако я не могу заставить ее работать. Вот урезанная версия:

 class Order {  public function create() {  $CCP = new CreditCardProcessor();  $success = $CCP-gt;chargeCreditCard();  return $success;  } }   class CreditCardProcessor {  public function chargeCreditCard() {  return false;  } }  
 class OrderTest extends TestCase {  public function testCreate() {  $mockCCP = $this-gt;getMockBuilder(CreditCardProcessor::class)  -gt;setMethods(['chargeCreditCard'])  -gt;getMock();   $mockCCP  -gt;method('chargeCreditCard')  -gt;willReturn(true);   $O = new Order();  $success = $O-gt;create();   $this-gt;assertTrue($success, 'Was not able to create order.');  } }   

Я прочитал документы и просмотрел несколько примеров, но не могу понять этого. Есть идеи, что я делаю не так? Спасибо.

Ответ №1:

Найдя больше примеров, я считаю, что решение состоит в том, чтобы передать зависимость в create качестве аргумента:

 class Order {  public function create($CCP) {  $success = $CCP-gt;chargeCreditCard();  return $success;  } }  

Тогда я смогу сделать то же самое в своем тесте:

 class OrderTest extends TestCase {  public function testCreate() {  $mockCCP = $this-gt;getMockBuilder(CreditCardProcessor::class)  -gt;setMethods(['chargeCreditCard'])  -gt;getMock();   $mockCCP  -gt;method('chargeCreditCard')  -gt;willReturn(true);   $O = new Order();  $success = $O-gt;create($mockCCP);   $this-gt;assertTrue($success, 'Was not able to create order.');  } }  

Я еще не пробовал, но этого должно хватить.

Мне не нравится идея изменения кода для удовлетворения тестов, но это, вероятно, также указывает на то, что мне нужно реструктурировать свой код.